最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中的指針新手初階指南

 更新時(shí)間:2021年10月08日 15:37:39   作者:地火轟雷  
指針是C語(yǔ)言的靈魂,精華之所在,指針強(qiáng)大而危險(xiǎn),用得好是一大利器,用得不好是一大潛在危害,下面這篇文章主要給大家介紹了C語(yǔ)言中指針的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.指針是什么

​ 初學(xué)者都有一個(gè)疑問(wèn),那就是指針是什么?簡(jiǎn)單的說(shuō),就是通過(guò)它能找到以它為地址的內(nèi)存單元。

地址指向了一個(gè)確定的內(nèi)存空間,所以地址形象的被稱為指針。

int main()
{
	int a = 10;
	int* pa = &a;
    
    return 0;
}
//pa是用來(lái)存放地址(指針),所以pa是指針變量。

總結(jié):指針就是變量,用來(lái)存放地址的變量。(存放在指針中的值都被當(dāng)成地址處理)。

​ 地址是唯一標(biāo)識(shí)一塊空間的。

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

2.指針和指針類型

​ 我們知道變量有不同的類型(整型、浮點(diǎn)型、字符型等),其實(shí)指針也是有不同類型的。

​ 指針類型的意義1:

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

char* 指針解引用訪問(wèn)1個(gè)字節(jié)

int* 指針解引用訪問(wèn)四個(gè)字節(jié)

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

​ 指針類型的意義2:

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

int* 指針+1 跳過(guò)四個(gè)字節(jié)

char* 指針+1 跳過(guò)一個(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);
	printf("%p\n", pc+1);

	return 0;
}

3.野指針

​ 野指針就是指針指向的位置是不可知的(隨機(jī)的、不正確的、沒(méi)有明確限制的)。

3.1野指針成因

指針未初始化

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

指針越界訪問(wèn)

int main()
{
    int arr[10] = 0;
    int i = 0;
    int* p = arr;
    
    for(i =0; i <= 10; i++)
    {
        *p = i;
        p++;//當(dāng)指針指向的范圍超出數(shù)組arr的范圍時(shí),p就是野指針
    }
    
    return 0;
}

指針指向的空間釋放

int* test()
{
    int a = 10;
    return &a;
}

int main()
{
    int* p = test();
    printf("%d\n",*p);
    
    return 0;
}

3.2如何規(guī)避野指針

指針初始化

小心指針越界

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

避免返回局部變量的地址

指針使用之前檢查有效性

int main()
{
    int a = 10;
    int* p = &a;//明確地初始化,確定指向
    
    int* p2 = NULL;//不知道一個(gè)指針當(dāng)前應(yīng)該指向哪里時(shí),可以初始化為NULL
    
    return 0;
}

4.指針的運(yùn)算

4.1指針±整數(shù)

#define N_VALUES 5
float values[N_VALUES];
float* vp;
for(vp = &values[0]; vp < &values[N_VALUES];)
{
    *vp++ = 0;
}
int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int* p = &arr[9];
    
    printf("%p\n",p);
    printf("%p\n",p-2);
    
    return 0;
}

4.2指針-指針

​ 指針-指針 得到的數(shù)字的絕對(duì)值是指針和指針之間元素的個(gè)數(shù)

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

指針-指針 的前提是兩個(gè)指針指向同一塊區(qū)域

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]);//err
    
    return 0;
}

應(yīng)用 求字符串長(zhǎng)度

int my_strlen(char* s)
{
	int count = 0;
	char* start = s;
	while(*s!='\0')
	{
		s++;
	}
	return s - start;
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
    
	return 0;
}

4.3指針的關(guān)系運(yùn)算

#define N_VALUES 5
float values[N_VALUES];
float *vp;
for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}

上述程序也可以寫成這樣

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

實(shí)際在絕大部分的編譯器上是可以順利完成任務(wù)的,然而我們還是應(yīng)該避免這么寫,因?yàn)闃?biāo)準(zhǔn)并不保證它可行。

標(biāo)準(zhǔn)規(guī)定

​ 允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許與指向第一個(gè)元素之前的那個(gè)內(nèi)存位置的指針進(jìn)行比較。

5.指針和數(shù)組

數(shù)組 - 是一塊連續(xù)的空間,放的是相同類型的元素

數(shù)組大小和元素類型,元素個(gè)數(shù)有關(guān)系

指針(變量) - 是一個(gè)變量,放地址

指針變量的大小 是4(32bit)/8(64bit)個(gè)byte

數(shù)組名確實(shí)是首元素地址

但是有兩個(gè)例外:

  1. sizeof(數(shù)組名) - 這里的數(shù)組名不是首元素的地址,是表示整個(gè)數(shù)組的,這里計(jì)算的是整個(gè)數(shù)組的大小,單位還是字節(jié)。
  2. &數(shù)組名 - 這里的數(shù)組名不是首元素的地址,是表示整個(gè)數(shù)組的,拿到的是整個(gè)數(shù)組的地址
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr);
	printf("%d\n", sz);
	return 0;
}
int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0;i < sz;i++)
	{
		*(p + i) = i;
	}
	for (i = 0;i < sz;i++)
	{
		printf("%d ", *(p + i));
	}

	return 0;
}

6.二級(jí)指針

​ 我們都知道,指針變量是變量,是變量就有地址,那么指針變量的地址存放在哪里呢?

這就是我們要了解的二級(jí)指針。

int main()
{
    int a = 10;
    int* p = &a;
    int** pp = &p;//pp就是二級(jí)指針
    **pp = 20;
    printf("%d\n", a);//a = 20
    return 0;
}

7.指針數(shù)組

​ 從名字上來(lái)看,大家覺(jué)得指針數(shù)組是指針還是數(shù)組?

答案是數(shù)組,是存放指針的數(shù)組。

整型數(shù)組 - 存放整型的數(shù)組就是整型數(shù)組

字符數(shù)組 - 存放字符的數(shù)組就是字符數(shù)組

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

int* 整型指針的數(shù)組

char* 字符指針的數(shù)組

int main()
{
	int arr[10];
	char ch[5];
    
	int* parr[5];
	char* pc[6];

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

	return 0;
}

​ 以上就是我們初始C語(yǔ)言指針的全部?jī)?nèi)容了,后續(xù)我還會(huì)更新C語(yǔ)言指針的進(jìn)階版本,希望大家能夠?qū)語(yǔ)言的指針能夠有更深層次的了解。

總結(jié)

到此這篇關(guān)于C語(yǔ)言指針的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++17?Filesystem?實(shí)用教程

    C++17?Filesystem?實(shí)用教程

    C++17的std::filesystem庫(kù)提供了強(qiáng)大的文件系統(tǒng)操作工具,本文就來(lái)介紹一下C++17?Filesystem?實(shí)用教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • 利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了2個(gè)函數(shù),分別是sprintf和sscanf,可以用來(lái)實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • C++ 回調(diào)接口設(shè)計(jì)和二進(jìn)制兼容詳細(xì)

    C++ 回調(diào)接口設(shè)計(jì)和二進(jìn)制兼容詳細(xì)

    再開發(fā)視頻編輯 SDK,SDK的回調(diào)接口設(shè)計(jì)成 C 風(fēng)格,結(jié)構(gòu)中放著一些函數(shù)指針,既然對(duì)外接口是 C++,為什么不直接使用 C++ 的虛函數(shù)?這篇文章便對(duì)這一問(wèn)題做個(gè)詳細(xì)介紹,需要的朋友可以參考一下
    2021-09-09
  • OpenCV實(shí)現(xiàn)高斯噪聲

    OpenCV實(shí)現(xiàn)高斯噪聲

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)高斯噪聲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++線程間的互斥和通信場(chǎng)景分析

    C++線程間的互斥和通信場(chǎng)景分析

    很多朋友對(duì)C++線程間的互斥和通信知識(shí)掌握不是多牢靠,今天小編通過(guò)模擬車站賣票應(yīng)用場(chǎng)景給大家詳細(xì)解析C++線程間的互斥和通信知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C語(yǔ)言設(shè)計(jì)簡(jiǎn)易電話簿

    C語(yǔ)言設(shè)計(jì)簡(jiǎn)易電話簿

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言設(shè)計(jì)簡(jiǎn)易電話簿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++ Array容器的顯示和隱式實(shí)例化詳細(xì)介紹

    C++ Array容器的顯示和隱式實(shí)例化詳細(xì)介紹

    這篇文章主要介紹了C++中Array容器的隱式實(shí)例化和顯式實(shí)例化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • 詳解PID控制器原理

    詳解PID控制器原理

    什么是 PID?它是一種在編程中使用的基本方法,如果正確調(diào)整,可以令人難以置信的有效和準(zhǔn)確,PID代表比例積分微分,3個(gè)單獨(dú)的部分連接在一起,雖然有時(shí)你不需要三個(gè)都使用。例如,您可以改為有P控制,PI控制或PD控制
    2021-06-06
  • c++從函數(shù)返回?cái)?shù)組的方法代碼

    c++從函數(shù)返回?cái)?shù)組的方法代碼

    在本篇文章里小編給大家整理的是關(guān)于c++從函數(shù)返回?cái)?shù)組的方法代碼,有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁(yè)面的示例代碼

    Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁(yè)面的示例代碼

    無(wú)論是MFC框架還是QT框架,實(shí)現(xiàn)加載數(shù)據(jù)的等待效果都是很麻煩的,不像WEB端輕輕松松一句代碼就搞定了。本文將通過(guò)Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁(yè)面的功能,需要的可以參考一下
    2022-01-01

最新評(píng)論

灵璧县| 怀宁县| 台北县| 庄河市| 沙洋县| 太仆寺旗| 航空| 静安区| 福建省| 永吉县| 丰镇市| 方山县| 洞口县| 广灵县| 乌兰察布市| 睢宁县| 定襄县| 库尔勒市| 杭州市| 夏津县| 永仁县| 成安县| 哈巴河县| 古丈县| 周口市| 宜丰县| 郎溪县| 元阳县| 英德市| 封丘县| 沾化县| 永安市| 石棉县| 博客| 鹤壁市| 商洛市| 巴楚县| 扎囊县| 荥经县| 乌拉特后旗| 祁阳县|