溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語言中指針指的是什么意思

發(fā)布時(shí)間:2021-10-26 09:12:11 來源:億速云 閱讀:200 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹C語言中指針指的是什么意思,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

    一、指針是什么?

    指針是包含內(nèi)存地址的變量,這個(gè)地址是內(nèi)存中另一個(gè)對(duì)象(通常是另一個(gè)變量)的位置。例如如果一個(gè)變量包含另一個(gè)變量的地址,我們說第一個(gè)變量指向第二個(gè)變量。

    相信大家看到上面這段話,可能有點(diǎn)懵,不急,我稍后再給大家解釋。在這里,我先給大家講述一下,數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)和讀取的?

    1.數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    如果在程序中定義了一個(gè)變量,在對(duì)程序進(jìn)行編譯的時(shí)候,系統(tǒng)就會(huì)給這個(gè)變量分配內(nèi)存單元。編譯系統(tǒng)根據(jù)程序中的定義的變量類型,分配一定長度的空間

    C語言中指針指的是什么意思

    那么,這些字節(jié)在內(nèi)存中被分配到哪里?我們?nèi)绾握业侥兀?br/>為了解決這個(gè)問題,我們就給內(nèi)存區(qū)的每一個(gè)字節(jié)一個(gè)編號(hào),這個(gè)就是它們的“地址”。它相當(dāng)于旅館中的房間號(hào),在地址所標(biāo)志的內(nèi)存單元中存放的數(shù)據(jù)則相當(dāng)于旅館房間中居住的旅客。

    C語言中指針指的是什么意思

    所以指針是個(gè)變量,存放內(nèi)存單元的地址(編號(hào))

    2.一個(gè)小的單元到底是多大?

    1、對(duì)于32位的機(jī)器,假設(shè)有32根地址線,那么假設(shè)每根地址線在尋址的時(shí)候產(chǎn)生高電平(高電壓)和低電平(低電壓)就是(1或者0);

    2根地址線上的電信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)用(1/0)表示,所以可能性
    00000000000000000000000000000000–11111111111111111111111111111111
    也就是有2^32 編號(hào),說明可以管理2的32次方個(gè)單元
    這里就有2的32次方個(gè)地址。

    每個(gè)地址標(biāo)識(shí)一個(gè)字節(jié),那我們就可以給
    (2^32Byte == 2^32/1024KB == 2^32 /1024/1024MB==2^32/1024/1024/1024GB == 4GB) 4G的空閑進(jìn)行編址。

    按照同樣的方法,我們可以計(jì)算出64四位機(jī)器,下面就直接給結(jié)論了。

    1、在32位的機(jī)器上,地址是32個(gè)0或者1組成二進(jìn)制序列,那地址就得用4個(gè)字節(jié)的空間來存儲(chǔ),所 以一個(gè)指針變量的大小就應(yīng)該是4個(gè)字節(jié)。
    2、在64位機(jī)器上,如果有64個(gè)地址線,那一個(gè)指針變量的大小是8個(gè)字節(jié),才能存放一個(gè)地址

    指針的大小在32位平臺(tái)是4個(gè)字節(jié),在64位平臺(tái)是8個(gè)字節(jié)。

    二、指針變量

    1.什么是指針變量

    思考一個(gè)問題,在編譯器中,如何把3賦值給i這個(gè)變量中?

    第一種作法,把3直接送到i所表示的單元中,例如“i=3”;

    int main()
    {
    	int i=3;
    	return 0;
    }

    第二種方法,把3送到變量p所指向的單元(即變量i的存儲(chǔ)單元,也就是地址,如p=3,其中i表示p指向的對(duì)象)

    int main()
    {
    	int i;
    	//int i = 3;//第一種方法
    	int *p = &i;//第二種方法
    	//這里我們對(duì)變量a,取出它的地址,可以使用&操作符。
       //將i的地址存放在p變量中,p就是一個(gè)指針變量。
    	*p = 3;
    	printf("%d\n", i);
    	return 0;
    }

    C語言中指針指的是什么意思

    2.指針類型

    思考一個(gè)問題:

    把int型變量a和float型變量b先后分配到2000開始的存儲(chǔ)單元中,&a和&b的信息完全相同嗎?

    答案是不相同的,因?yàn)殡m然存儲(chǔ)單元的編號(hào)相同,但他們的數(shù)據(jù)類型不同。

    此外,還因?yàn)閿?shù)據(jù)類型的不同,無法確定是從一個(gè)字節(jié)中取信息(字符數(shù)據(jù)),還是從兩個(gè)字節(jié)取信息(短整型),抑或是從四個(gè)字節(jié)取信息(整型),不同的類型,存儲(chǔ)方式是不一樣的。

    如果我們要將&num(num的地址)保存到p中,我們需要我們給指針變量相應(yīng)的類型。

    如下:

    char  *pc = NULL;//har* 類型的指針是為了存放 char 類型變量的地址。
    int   *pi = NULL;//int* 類型的指針是為了存放 int 類型變量的地址。
    short *ps = NULL;//short* 類型的指針是為了存放 short 類型變量的地址
    long  *pl = NULL;
    float *pf = NULL;
    double *pd = NULL;

    這里可以看到,指針的定義方式是: 類型名 * 指針變量名 。

    【總結(jié)】

    C語言中的地址包括位置信息(內(nèi)存編號(hào),或稱純地址)和它所指向的數(shù)據(jù)的類型信息,或者說它是“帶類型的地址”,如&a,一般稱它位“變量a的地址”,但是確切地說,它是“整型變量a的地址”

    3.指針類型的作用

    作用一:

    指針類型決定了指針解引用操作的時(shí)候,一次訪問幾個(gè)字節(jié)(訪問內(nèi)存的大小)

    int main()
    
    {	int a = 0x11223344;
    	int* pa = &a;
    	*pa = 0;
    	return 0;
    }

    C語言中指針指的是什么意思

    int main()
    {
    	int a = 0x11223344;
    /*	int* pa = &a;
    	*pa = 0;*/
    	char* pc = &a;//int*
    	*pc = 0;
    	return 0;
    }

    C語言中指針指的是什么意思

    指針類型的意義1

    指針類型決定了指針解引用操作的時(shí)候,一次訪問幾個(gè)字節(jié)(訪問內(nèi)存的大小)
    char* 指針解引用訪問1個(gè)字節(jié)
    int* 指針解引用訪問4個(gè)字節(jié)

    作用二:

    指針類型決定了,指針±整數(shù)的時(shí)候的步長(指針±整數(shù)的時(shí)候,跳過幾個(gè)字節(jié))

    int main()
    {
    	int a = 10;
    	int * pa=&a;
    	char *pc = &a;
    	printf("%p\n", pa);
    	printf("%p\n", pc);
    
    	printf("%p\n", pa+1);//如果是整型指針int*,+1則跳過4個(gè)字節(jié)、
    	printf("%p\n", pc+1);//char* 指針+1,跳過1個(gè)字節(jié)
    	return 0;
    }

    C語言中指針指的是什么意思

    三、野指針

    1.什么是野指針

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

    什么意思?舉個(gè)例子
    就是你撿到一把鑰匙,但是不知道它可以開那道門。

    2.野指針成因

    2.1. 指針未初始化

    指針沒有初始化,里面放的是隨機(jī)值

    #include <stdio.h>
    int main()
    { 
     	int *p;//局部變量指針未初始化,默認(rèn)為隨機(jī)值
        *p = 20;//通過p中存的隨機(jī)值作為地址,找到一個(gè)空間,這個(gè)空間不屬于我們當(dāng)前的程序,就造成了非法訪問
    //如果非法訪問了,p就是野指針
     return 0; }
    2.2指針越界訪問

    指針越界造成野指針問題

    int main()
    {
    	int arr[10] = 0;
    	int i = 0;
    	int * p = arr;
    
    	for (i = 0; i <= 10; i++)//這里循環(huán)了11次,當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針
    	{
    		*p = 1;
    		p++;
    	}
    	return 0;
    }
    2.3指針指向的空間釋放

    當(dāng)一個(gè)指針指向的空間釋放了,這個(gè)指針就變成野指針了

    int* test()
    {
    	int a = 10;
    	return &a;  //int *,生命周期,出來就銷毀了
    }
    int main()
    {
    	int *p = test();
    	//printf("不愧是你\n");//加入這里加了一條語句,下面的值就變了
    	printf("%d\n", *p);//編譯出10是因?yàn)榫幾g器會(huì)對(duì)值做一次保留。所以能訪問到上面函數(shù)不一定是對(duì)的
    	return 0;
    }

    3.如何規(guī)避野指針

    • 指針初始化

    • 小心指針越界

    • 指針指向空間釋放即使置NULL

    • 避免返回局部變量的地址

    • 指針使用之前檢查有效性

    //規(guī)避野指針
    int main()
    {
    	int a = 10;
    	int * p = &a;//1、明確初始化,確定指向
    
    	int * p2 = NULL;//NULL本質(zhì)是0,2、不知道一個(gè)指針當(dāng)前應(yīng)該指向哪里是,可以初始化位NULL
    	//*p2 = 100;//err,對(duì)于空指針,是不能直接解引用的
    
    	//如何規(guī)避? 
    	if (p2 != NULL)//先判斷是不是空指針
    	{
    		*p2 = 100;//這樣才對(duì)
    	}
    
    }

    四、指針運(yùn)算

    1.指針±整數(shù)

    int main()
    {
    	float arr[5];
    	float *p;
    	for (p = &arr[0]; p < &arr[5];)
    	{
    		*p++ = 0;//對(duì)一個(gè)指針加1使它指向數(shù)組中的下一個(gè)元素,把指針指向的內(nèi)容全部賦值給0
    	}
    	return 0;
    }

    C語言中指針指的是什么意思

    也就說,如果加2使它向右移動(dòng)2個(gè)元素的位置,依次類推。把一個(gè)指針減去2使它向左移動(dòng)2個(gè)元素的位置。

    2.指針-指針

    1、指針減去指針的前提,是兩個(gè)指針指向同一塊區(qū)域
    2、指針減去指針,得到數(shù)字的絕對(duì)值,是指針和指針之間元素的個(gè)數(shù)

    int main()
    {
    	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    	char ch[5] = { 0 };
    	//printf("%d\n", &arr[9] - &ch[0]);//這種算法是錯(cuò)誤的
    
    	printf("%d\n", &arr[9] - &arr[0]);//算出的是元素的個(gè)數(shù)
    	printf("%d\n", &arr[0] - &arr[9]);//
    	//指針減去指針的前提,是兩個(gè)指針指向同一塊區(qū)域
    	//指針減去指針,得到數(shù)字的絕對(duì)值,是指針和指針之間元素的個(gè)數(shù)
    
    	return 0;
    }

    C語言中指針指的是什么意思

    【注意】
    指針與指針之間不能進(jìn)行加法運(yùn)算,因?yàn)檫M(jìn)行加法后,得到的結(jié)果指向一個(gè)不知所向的地方,沒有實(shí)際意義

    什么意思,舉個(gè)例子。

    C語言中指針指的是什么意思

    五、指針和數(shù)組

    1.數(shù)組元素的指針

    一個(gè)變量有地址,一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用存儲(chǔ)單元,它們都有相應(yīng)的地址。

    指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素,也就是把某一元素地址放到一個(gè)指針變量中。

    所謂數(shù)組元素的指針就是數(shù)組元素的地址

    (1)用一個(gè)指針變量指向一個(gè)數(shù)組元素

    int main()
    {
    	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    	int* p;//定義p位指向整型變量的指針變量
    	p = &arr[0];//把a(bǔ)[0]元素的地址賦給指針變量p
    	return 0;
    }

    以上是使指針變量p指向a數(shù)組的第0號(hào)元素

    C語言中指針指的是什么意思

    2.通過指針引用數(shù)組元素

    (1)下標(biāo)法,如a[i]形式
    (2)指針法,如*(a+i)

    下標(biāo)法:

    int main()
    {
    	int arr[10];
    	int i = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	printf("%d\n", sz);
    	printf("%p\n", arr);//數(shù)組名就是首元素地址
    	//下標(biāo)法
    	printf("%p\n", &arr[0]);
    	int* p=&arr[5];//整型地址放在整型指針上,從而讓指針跟數(shù)組建立聯(lián)系
    
    	//數(shù)組名確實(shí)是首元素地址,
    	//但是有兩個(gè)例外
    	//1.sizeof(數(shù)組名),這里的數(shù)組名不是首元素地址,是表示整個(gè)數(shù)組,計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)
    	//2.&數(shù)組名,拿到的是整個(gè)數(shù)組的地址
    
    	return 0; 
    }

    C語言中指針指的是什么意思

    指針法:

    int main()
    {
    	int arr[10];
    	int i = 0;
    	int sz = sizeof(arr) / sizeof(arr[0]);
    
    	int* p=&arr[0];//整型地址放在整型指針上,從而讓指針跟數(shù)組建立聯(lián)系
    	//指針法
    	for (i = 0; i < sz; i++)
    	{
    		*(p + i) = i;// p+i 其實(shí)計(jì)算的是數(shù)組 arr 下標(biāo)為i的地址。
    	}
    	for (i = 0; i < sz; i++)
    	{
    		printf("%d ", *(p + i));
    	}
    	return 0; 
    }

    C語言中指針指的是什么意思

    一個(gè)小知識(shí):

    int main()
    {
    
    	int arr[10] = { 0 };
    	arr;//數(shù)組名
    	&arr[0];//取出首元素地址
    	&arr;//取出整個(gè)數(shù)組的地址
    	printf("%d\n", &arr[0]);
    	printf("%d\n", &arr);
    	return 0;
    }

    C語言中指針指的是什么意思

    六、二級(jí)指針

    指針變量的地址二級(jí)指針

    什么意思?舉個(gè)例子

    int main()
    {
    	int a = 10;//4byte,向內(nèi)存申請(qǐng)4個(gè)字節(jié)
    	int* p=&a;//p指向a,稱為一級(jí)指針
    
    	int* *pp=&p;//pp就是二級(jí)指針,pp存放的是一級(jí)指針的地址
    	* *pp = 20;//需兩層解引用	
    	printf("%d\n", a);
    	//int** * ppp = &pp;//ppp就是三級(jí)指針
    	return 0;
    }

    七、指針數(shù)組

    存放指針的數(shù)組就是指針數(shù)組

    int main()
    {
    	int arr[10];//整型數(shù)組,存放整型的數(shù)組就是整型數(shù)組
    	char ch[5];//字符數(shù)組,存放字符的數(shù)組就是字符數(shù)組
    	//指針數(shù)組,存放指針的數(shù)組就是指針數(shù)組
    	//int*  整型指針的數(shù)組
    	//char* 字符指針的數(shù)組
    
    	int* parr[5];//整型指針的數(shù)組,存放的類型都是int*
    	char* pc[6];//字符指針的數(shù)組
    	return 0;
    }

    我們也可以用同樣的方式來訪問指針數(shù)組。
    如下

    int main()
    {
    	int a = 10;
    	int b = 20;
    	int c = 30;
    
    	int * arr[3] = { &a, &b, &c };
    	int i = 0;
    	for (i = 0; i < 3; i++)
    	{
    		printf("%d\n",*(arr[i]));
    	}
    
    	int *pa = &a;
    	int *pb = &b;
    	int *pc = &c;
    	return 0;
    }

    C語言中指針指的是什么意思

    以上是“C語言中指針指的是什么意思”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI