国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用

這篇具有很好參考價值的文章主要介紹了【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1、什么是指針?

1.1 內(nèi)存

1.2 指針變量

二、指針和指針類型

1、指針類型

2、指針+整數(shù)

3、指針的解引用

三、野指針

1、野指針成因

(1) 指針未初始化

(2) 指針越界訪問

(3) 指針指向的空間釋放

2、如何規(guī)避野指針

四、指針運算

1、指針-指針


? ? ? ?本篇文章我們來了解C語言中指針的相關內(nèi)容,對于指針可以說是C語言學習中較難理解的內(nèi)容。本篇以了解指針為目的,從表層入手,淺析C指針!

1、什么是指針?

理解指針的?兩個要點:

  1. 指針是內(nèi)存中一個最小單元的編號,也就是地址。
  2. 平時我們口中所說的指針,通常指的是指針變量,是用來存放內(nèi)存地址的變量。

總結(jié):指針就是地址,口語中說的指針通常指的是指針變量。

1.1 內(nèi)存

學習指針首先要了解?內(nèi)存:

內(nèi)存是電腦上特別重要的存儲器,計算機中程序的運行都是在內(nèi)存中進行的。所以為了有效的使用內(nèi)存,就把內(nèi)存劃分成一個個小的內(nèi)存單元,每個內(nèi)存單元的大小是1個字節(jié)。為了能夠有效的訪問到內(nèi)存的每個單元,就給內(nèi)存單元進行了編號,這些編號被稱為該內(nèi)存單元的地址。(每個內(nèi)存單元都有地址)就好比電腦是我們的學校,內(nèi)存就是學校的一個宿舍樓,而一個內(nèi)存單元就代表宿舍樓中的一個宿舍,而宿舍的門牌號就表示一個地址。

對于32位的機器,假設有32根地址線,那么假設每根地址線在尋址的時候產(chǎn)生高電平(高電壓)和低電平(低電壓)就是(1或者0);那么32根地址線產(chǎn)生的地址就會是:2^32 也就是說32位機器能夠產(chǎn)生2的32次方個地址。每個地址標識一個字節(jié),那我們就可以給 (2^32^Byte == 2^32^/1024KB == 2^32^/1024/1024MB==2^32^/1024/1024/1024GB == 4GB) 4G的空間進行編址。同理64位機器,如果給64根地址線,那么將有能力管理2^32^×4GB的內(nèi)存空間。
?

1.2 指針變量

為了能夠更好的訪問內(nèi)存空間,我們可以通過&(取地址操作符)取出變量的內(nèi)存其實地址,把地址可以存放到一個變量中,這個變量就是指針變量。

#include <stdio.h>
int main()
{
 int num = 10;//在內(nèi)存中開辟一塊空間
 int *p = &num;//這里我們對變量a,取出它的地址,可以使用&操作符。
    //num變量占用4個字節(jié)的空間,這里是將a的4個字節(jié)的第一個字節(jié)的地址存放在p變量
	  中,p就是一個之指針變量。
 return 0; }

? ? ? ? ? ? ? ? ? ? ? ? ? ??【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用,c語言,開發(fā)語言,指針,算法

總結(jié):

指針變量是用來存放地址的,地址是唯一標示一個內(nèi)存單元的。
在32位的機器上,地址是32個0或者1組成二進制序列,那地址就得用4個字節(jié)的空間來存儲,所以 一個指針變量的大小就應該是4個字節(jié)。
在64位機器上,如果有64個地址線,那一個指針變量的大小是8個字節(jié),才能存放一個地址。

二、指針和指針類型

1、指針類型

char ?*pc = NULL;//字符指針?
int ? *pi = NULL;//整形指針?
short *ps =NULL;//短整型指針?
long ?*pl = NULL;//長整型指針?
float *pf = NULL;//單精度浮點型指針
double *pd = NULL;//雙精度浮點型指針?

? ? ? ? ? ? ? ? ? ? ? ? ?【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用,c語言,開發(fā)語言,指針,算法

其實:
char*?類型的指針是為了存放?char?類型變量的地址。
short*?類型的指針是為了存放?short?類型變量的地址。
int*?類型的指針是為了存放?int?類型變量的地址。

那指針類型的意義是什么?

2、指針+整數(shù)

示例代碼:

#include <stdio.h>
int main()
{
    int n = 8;
    char* pc = (char*)&n;
    int* pi = &n;

    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return  0;
}

結(jié)果:

【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用,c語言,開發(fā)語言,指針,算法

結(jié)論:

1. 指針類型決定了指針的步長(向前 / 向后 走一步多大距離)

2. char* 指針 + 1,意思是跳過一個字符,也就是向后走1個字節(jié)
3. short* 指針 + 1,向后走2個字節(jié)
4. int* 指針 + 1,意思是跳過1個整形,也就是向后走4個字節(jié)
5. double* 指針 + 1,意思是跳過一個double,也就是向后走8個字節(jié)

3、指針的解引用

示例代碼:

//演示實例
#include <stdio.h>
int main()
{
 	int n = 0x11223344;
 	char *pc = (char *)&n;
 	int *pi = &n;
 	*pc = 0;   
 	*pi = 0;   
 	return 0; 
 }

結(jié)果:

【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用,c語言,開發(fā)語言,指針,算法

?結(jié)論:

指針類型決定了:指針解引用操作的時候,訪問幾個字節(jié)(權限)

  1. char* 的指針解引用訪問1個字節(jié)
  2. int * 的指針解引用訪問4個字節(jié)
  3. double* 的指針,解引用訪問8個字節(jié)

三、野指針

概念:?野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)

1、野指針成因

(1) 指針未初始化

#include <stdio.h>
int main()
{ 
 	int *p;//局部變量指針未初始化,就會默認為隨機值
    *p = 10;
 	return 0; 
}

(2) 指針越界訪問

#include <stdio.h>
int main()
{
    int arr[5] = {0};
    int *p = arr;
    for(int i=0; i<=6; i++){
   
        //當指針指向的范圍超出數(shù)組arr的范圍時,p就是野指針
        *(p++) = i;
   }
    return 0;
}

(3) 指針指向的空間釋放

int* test()
{
	int num = 100;
	return &num;//出了函數(shù),這塊內(nèi)存就不屬于我們了,還給了操作系統(tǒng)
}

int main()
{
	int* p = test();
	*p = 200;
	return 0;
}

注意:變量num為局部變量,生命周期從創(chuàng)建開始到出test函數(shù)結(jié)束,test函數(shù)調(diào)用結(jié)束后num會將空間還給操作系統(tǒng),此時回到主函數(shù)p的地址已經(jīng)被釋放,此時p就是野指針。

2、如何規(guī)避野指針

  1. 指針初始化(已知指向時明確初始化;未知初始化為NULL)
  2. 小心指針越界
  3. 指針指向空間釋放,及時置NULL
  4. 避免返回局部變量的地址
  5. 指針使用之前檢查有效性

示例代碼:

#include <stdio.h>
int main()
{
    int *p = NULL;//未知指向初始化為NULL
    int a = 10;
    p = &a;//明確初始化
    if(p != NULL)//為空指針不訪問(無效指針)
   {
        *p = 20;//不為空再訪問
   }
    return 0; 
}

四、指針運算

例如:通過指針加整數(shù)遍歷數(shù)組元素

示例代碼:

int main()
{
	int arr[5] = {1,2,3,4,5};
	int* p = arr;
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", *(p + i));
	}

	return 0;
}

1、指針-指針

含義:指針和指針相減的絕對值等于指針和指針之間元素的個數(shù)。

前提:兩個指針相減的前提是:指針指向的同一塊連續(xù)的空間。

#include<stdio.h>
int main()
{
	
	int arr[10] = {0};
	printf("%d\n", &arr[9] - &arr[0]); //結(jié)果9
	printf("%d\n", &arr[0] - &arr[9]);  //結(jié)果-9
	
	//兩個指針相減的前提是:指針指向的同一塊連續(xù)的空間
	//int a = 5;
	//char c = 'a';
	//printf("%d\n", &a - &c);//錯誤,沒有指向同一塊連續(xù)的空間

	return 0;
}

補充:指針+指針沒有意義。文章來源地址http://www.zghlxwxcb.cn/news/detail-577200.html

創(chuàng)作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦。

到了這里,關于【C語言】-- 一篇帶你了解指針,內(nèi)存,解引用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù)

    C語言學習系列-->一篇帶你看懂內(nèi)存函數(shù)

    上篇文章學習了C語言字符串函數(shù),只是對字符串進行操作 本節(jié),小編整理了一下C語言中的內(nèi)存函數(shù),對內(nèi)存進行操作,只針對會內(nèi)存塊,不針對數(shù)據(jù) memcpy是對內(nèi)存拷貝 拷貝的可能是字符串,也可能是整型數(shù)組 所以使用 void* 將source拷貝到destination,指定字節(jié)數(shù)為num code arr

    2024年02月09日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底了解棧

    【數(shù)據(jù)結(jié)構(gòu)】一篇帶你徹底了解棧

    棧:一種線性數(shù)據(jù)結(jié)構(gòu),其只允許在固定的一端進行插入和刪除元素操作。進行數(shù)據(jù)插入和刪除操作的一端稱為棧頂 (Top), 另一端稱為棧底 [Bottom]。棧中的數(shù)據(jù)元素遵守后進先出LIFO(Last In First Out)的原則。即最后進入的元素最先被訪問。 壓棧:棧的插入操作叫做進棧/壓棧

    2024年02月05日
    瀏覽(26)
  • [Linux 基礎] 一篇帶你了解linux權限問題

    [Linux 基礎] 一篇帶你了解linux權限問題

    Linux下有兩種用戶:超級用戶(root)、普通用戶。 超級用戶:可以再linux系統(tǒng)下做任何事情,不受限制 普通用戶:在linux下做有限的事情。 超級用戶的命令提示符是“#”,普通用戶的命令提示符是“ $ ” 命令: su [用戶名] 功能: 切換用戶。 例如,要從root用戶切換到普通用

    2024年02月08日
    瀏覽(21)
  • [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細了解希爾排序

    [數(shù)據(jù)結(jié)構(gòu) -- 手撕排序第二篇] 一篇帶你詳細了解希爾排序

    目錄 1、常見排序算法 1.1 插入排序基本思想 2、希爾排序 2.1 希爾排序( 縮小增量排序 ) 2.1.1 預排序階段 2.1.2 插入排序階段 2.2 單趟希爾排序 2.2.1 思路分析 2.2.2 代碼實現(xiàn) 3、希爾排序代碼實現(xiàn) 4、希爾排序時間復雜度 5、希爾排序與插入排序效率對比 6、希爾排序特性總結(jié) 直接

    2024年02月13日
    瀏覽(28)
  • [C++]類與對象(下) -- 初始化列表 -- static成員 -- 友元 -- 內(nèi)部類,一篇帶你深度了解。

    [C++]類與對象(下) -- 初始化列表 -- static成員 -- 友元 -- 內(nèi)部類,一篇帶你深度了解。

    ? 目錄 1、再談構(gòu)造函數(shù) 1.1 構(gòu)造函數(shù)體賦值 1.2 初始化列表 1.2.1 初始化列表的意義 1.3 explicit 2、static成員 2.1 問題引入 2.2 特性 3、友元 3.1 友元函數(shù) 3.2 友元類 4、內(nèi)部類 在創(chuàng)建對象時,編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個成員變量一個合適的初始值。 我們構(gòu)造函

    2024年02月12日
    瀏覽(23)
  • 數(shù)組(一篇帶你掌握數(shù)組)

    數(shù)組(一篇帶你掌握數(shù)組)

    ? ? 在之前,我們想要存儲一個數(shù)據(jù)的時候可以創(chuàng)建變量,例如存儲一個整形的變量,我們使用int類型的變量來存儲,那么如果存儲一組相同類型的數(shù)據(jù)呢?這時我們就引入了 數(shù)組 的概念。 目錄 一、一維數(shù)組的創(chuàng)建和初始化 1.1數(shù)組的創(chuàng)建 1.2 數(shù)組的初始化 1.3 一維數(shù)組的使

    2023年04月08日
    瀏覽(20)
  • 一篇帶你精通MPLS

    一篇帶你精通MPLS

    MPLS:多協(xié)議標簽交換 可以基于多種不同的3層協(xié)議來生成2.5層的標簽信息 包為網(wǎng)絡層的PDU,故包交換就是基于IP地址進行數(shù)據(jù)轉(zhuǎn)發(fā);也就是路由器的路由行為。(路由器和終端基于3層的IP地址數(shù)據(jù)轉(zhuǎn)發(fā)的路由行為) 原始包交換 查兩張表 在包交換過程中,數(shù)據(jù)包每經(jīng)過一個路

    2024年02月22日
    瀏覽(28)
  • Javaの一篇帶你吃透接口

    Javaの一篇帶你吃透接口

    隨著接口的到來,JavaSE的學習筆記大結(jié)局也即將來臨,最近的幾篇博客寫到了封裝,繼承,多態(tài),抽象類等等,都循序漸進得介紹了這類的知識,大家如果接口這一塊理解的很困難的話,建議去完善一下前面的知識哦 ??Java封裝 ??靜態(tài)成員 ??代碼塊 ??內(nèi)部類 ??繼承 ??多

    2023年04月08日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包