欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言指針原來也可以這樣了解

 更新時間:2021年08月13日 15:30:07   作者:sjp151  
這篇文章非常詳細(xì)的講解了C語言中指針的概念,包含多種方法,多種定義,全面的說明了C語言的特性,希望能給你帶來幫助

什么是指針

指針是應(yīng)該對象,可以直接指向電腦存儲器中的某個地方,這個地方就是內(nèi)存單元,指針指向的是一個對象的地址。地址的指向就是內(nèi)存單元,一個內(nèi)存單元是一個字節(jié),在32位平臺上面,一個指針是4個字節(jié)。因?yàn)?2位的平臺有32根地址線,每根地址線是 1 bit,所以32位平臺的指針大小是 4 個字節(jié)。同理,64位平臺的指針大小就是 8 個字節(jié)。

指針的應(yīng)用

指針用于指向某個對象的地址,也可以通過指針解引用來修改對象。

int main()
{
	int a = 10;
	int* p = &a;			
	printf("%d\n", *p);		//10
	return 0;
}

&a 就是把 a 的地址取出來。int* 說明 p 是指針變量,指向的對象是整型。所以 *p 指向的就是 a 的地址,打印出來也是10。因?yàn)?*p和 a 指向的是同一塊內(nèi)存,所以對 *p修改也就是對 a 的值進(jìn)行修改。

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;
	printf("%d\n", a);		//20
	return 0;
}

這里就是通過 *p 對 a 的值進(jìn)行修改。

指針 ± 整數(shù)

指針 + 指針

指針指向的是一個對象。比如指針 + 1,就是指向后一個元素,拿數(shù)組舉例。

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", *arr);
	printf("%d\n", *(arr + 1));
	printf("%d\n", *(arr + 2));
	return 0;
}

在這里插入圖片描述

從圖片可知,指針每次 + 1,都會指向數(shù)組的下一個元素。如果是對數(shù)組取地址再 + 1的話,就會跳過整個數(shù)組,指向整個數(shù)組后面的地址。所以使用指針加減和取地址加減的時候,一定要注意。

指針 - 指針

指針 - 指針?biāo)愕氖莾蓚€指針之間的元素個數(shù)。

int my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')
		p++;
	return p - s;
}
int main()
{
	char arr[10] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d\n", ret);			//6
	return 0;
}

算的結(jié)果是 6,因?yàn)橹羔樝鄿p,得到了差的元素個數(shù)。

野指針

野指針就是指針執(zhí)行的位置使隨機(jī)的,是沒有被分配的內(nèi)存空間。

野指針成因

野指針是由于指針未初始化,指針越界訪問造成的。野指針也是經(jīng)常導(dǎo)致程序崩潰的原因。

指針未初始化

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

這里的指針就沒有初始化,沒有初始化指向的內(nèi)容,就是野指針,而且這里連編譯也完成不了。

指針越界訪問

指針越界訪問是一件非??膳碌氖虑?,會導(dǎo)致程序崩潰,程序死循環(huán)。

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("haha\n");
	}
	return 0;
}

上面這個代碼就死循環(huán)了,因?yàn)橹羔樤浇缭L問,造成了死循環(huán).這里是一個壓棧的情況造成的。用下面這張圖來解釋:

在這里插入圖片描述

上面這張圖就描述了這個死循環(huán)的過程。

指針和數(shù)組

數(shù)組名其實(shí)表示的就是首元素的地址,傳參的時候傳數(shù)組名就等于是傳了數(shù)組的首元素地址。因?yàn)閿?shù)組在內(nèi)存當(dāng)中是連續(xù)存儲的,所以只要把首元素地址傳過去就可以了。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%p\n", &arr[0]);
	printf("%p\n", arr);
	return 0;
}

在這里插入圖片描述

通過圖片就可以看出。

指針 ± 和數(shù)組的關(guān)系

當(dāng)指針 ± 的時候,解引用指向數(shù)組的元素也在發(fā)生改變,+1,表示向后移動一個元素。

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int* p = arr; //用指針來存放數(shù)組首元素的地址
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
	}
	return 0;
}

使用數(shù)組的時候,也可以換做指針來使用,看起來會整潔一些。

二級指針

因?yàn)橹羔樧兞恳彩亲兞?,是變量就會有地址,那么指針變量的地址就可以用二級指針來描述。就是把一個變量的地址放在指針里面,然后再把指針的地址放在二級指針里面。所以就可以通過對二級指針解引用拿到一級指針的地址,對二級指針兩次解引用,就拿到變量的地址了。

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	printf("%p\n", a);
	printf("%p\n", *p);
	printf("%p\n", **pp);
	return 0;
}

在這里插入圖片描述

既然能拿到地址,那么對pp解引用之后修改,也就修改了a的值。

int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
	**pp = 20;
	printf("%d\n", a);
	return 0;
}

在這里插入圖片描述

所以在使用二級指針的時候,也可以直接對變量進(jìn)行修改。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望能夠您能夠關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 關(guān)于C++中的static關(guān)鍵字的總結(jié)

    關(guān)于C++中的static關(guān)鍵字的總結(jié)

    C++的static有兩種用法:面向過程程序設(shè)計中的static和面向?qū)ο蟪绦蛟O(shè)計中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用
    2013-09-09
  • C/C++讀取配置文件的方式小結(jié)

    C/C++讀取配置文件的方式小結(jié)

    這篇文章主要為大家詳細(xì)介紹了C/C++中讀取配置文件的幾種常見方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Linux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法

    Linux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法

    下面小編就為大家?guī)硪黄狶inux下g++編譯與使用靜態(tài)庫和動態(tài)庫的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • VC中LINK 2001 和 LINK 2009 的錯誤的解決方法

    VC中LINK 2001 和 LINK 2009 的錯誤的解決方法

    最近將兩個開源C++項(xiàng)目編譯成windows版本的時候遇到很多問題,編譯的時候總是報錯,報的最多的是無法解析的外部符號”,經(jīng)過近3天的折騰總算都通過了,這里是一些總結(jié)
    2020-10-10
  • C語言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)

    C語言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)

    strcmp函數(shù)語法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-1
    2022-05-05
  • 淺析c++ 中const關(guān)鍵字

    淺析c++ 中const關(guān)鍵字

    const是一個C++語言的限定符,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。下面通過本文給大家分享c++ const關(guān)鍵字的相關(guān)知識,一起看看吧
    2017-06-06
  • 詳解C語言處理算經(jīng)中著名問題百錢百雞

    詳解C語言處理算經(jīng)中著名問題百錢百雞

    古代的很多數(shù)學(xué)問題都可以用現(xiàn)代的編程語言去嘗試解決,就如本篇,將會帶你通過C語言來解決算經(jīng)中百錢百雞問題,感興趣的朋友來看看吧
    2022-02-02
  • C語言在linux下編程詳解

    C語言在linux下編程詳解

    這篇文章主要介紹了linux下基于C語言的編程,實(shí)例分析了基本使用技巧與相關(guān)概念,具有一定參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Opencv基于CamShift算法實(shí)現(xiàn)目標(biāo)跟蹤

    Opencv基于CamShift算法實(shí)現(xiàn)目標(biāo)跟蹤

    這篇文章主要為大家詳細(xì)介紹了Opencv基于CamShift算法實(shí)現(xiàn)目標(biāo)跟蹤,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例

    C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例

    這篇文章主要介紹了C語言 字符串首字母轉(zhuǎn)換成大寫簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論