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

C語言中的初階指針詳解

 更新時間:2021年10月08日 16:38:53   作者:地火轟雷  
這篇文章主要介紹了C語言中的初階指針,介紹了其相關(guān)概念,具有一定參考價(jià)值。需要的朋友可以了解下,希望能夠給你帶來幫助

1.指針是什么

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

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

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

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

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

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

2.指針和指針類型

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

​ 指針類型的意義1:
指針類型決定了指針解引用操作的時候,一次訪問幾個字節(jié)(訪問內(nèi)存的大?。?br /> char* 指針解引用訪問1個字節(jié)
int* 指針解引用訪問四個字節(jié)

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

​ 指針類型的意義2:

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

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

char* 指針+1 跳過一個字節(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ī)的、不正確的、沒有明確限制的)。

3.1野指針成因

1.指針未初始化

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

2.指針越界訪問

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的范圍時,p就是野指針
    }
    return 0;
}

3.指針指向的空間釋放

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

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

1.指針初始化

2.小心指針越界

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

4.避免返回局部變量的地址

5.指針使用之前檢查有效性

int main()
{
    int a = 10;
    int* p = &a;//明確地初始化,確定指向
    int* p2 = NULL;//不知道一個指針當(dāng)前應(yīng)該指向哪里時,可以初始化為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ù)字的絕對值是指針和指針之間元素的個數(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;
}

指針-指針 的前提是兩個指針指向同一塊區(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)用 求字符串長度

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ù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進(jìn)行比較。

5.指針和數(shù)組

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

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

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

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

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

但是有兩個例外:

1.sizeof(數(shù)組名) - 這里的數(shù)組名不是首元素的地址,是表示整個數(shù)組的,這里計(jì)算的是整個數(shù)組的大小,單位還是字節(jié)。

2.&數(shù)組名 - 這里的數(shù)組名不是首元素的地址,是表示整個數(shù)組的,拿到的是整個數(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.二級指針

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

這就是我們要了解的二級指針。

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

7.指針數(shù)組

​ 從名字上來看,大家覺得指針數(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;
}

​ 總結(jié)

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

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

相關(guān)文章

  • C語言實(shí)現(xiàn)掃雷小游戲完整算法詳解(附完整代碼)

    C語言實(shí)現(xiàn)掃雷小游戲完整算法詳解(附完整代碼)

    掃雷游戲想必我們都有玩過,那么今天就用C語言來簡單實(shí)現(xiàn)“掃雷”小游戲,這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)掃雷小游戲完整算法的相關(guān)資料,文中給出了完整的實(shí)例代碼,需要的朋友可以參考下
    2022-06-06
  • VC實(shí)現(xiàn)對話框窗口任意分割

    VC實(shí)現(xiàn)對話框窗口任意分割

    最近寫MFC的程序,想在對話框里實(shí)現(xiàn)窗口的任意分割?,F(xiàn)在網(wǎng)絡(luò)資料一大抄,找個東西實(shí)在麻煩??偹氵@個很簡單,很快就搞定了,寫下來做個筆記。
    2015-06-06
  • C語言冷知識之預(yù)處理字符串操作符詳解

    C語言冷知識之預(yù)處理字符串操作符詳解

    當(dāng)年學(xué)習(xí)C語言的第一門課就提到過標(biāo)記(Token)的概念,不過,相信在多年之后你再次聽到這個術(shù)語時會一臉懵逼,比如我。因此特地翻了翻資料,整理下來這些筆記,希望對大家有所幫助
    2022-11-11
  • c++實(shí)現(xiàn)的常見緩存算法和LRU

    c++實(shí)現(xiàn)的常見緩存算法和LRU

    LRU緩存算法也叫LRU頁面置換算法,是一種經(jīng)典常用的頁面置換算法,下面這篇文章主要介紹了c++實(shí)現(xiàn)的常見緩存算法和LRU,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C語言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬敵下篇

    C語言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬敵下篇

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • Qt實(shí)現(xiàn)串口助手

    Qt實(shí)現(xiàn)串口助手

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)串口助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • c++代碼實(shí)現(xiàn)tea加密算法的實(shí)例詳解

    c++代碼實(shí)現(xiàn)tea加密算法的實(shí)例詳解

    這篇文章主要介紹了c++代碼實(shí)現(xiàn)tea加密算法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 利用C語言結(jié)構(gòu)體實(shí)現(xiàn)通訊錄

    利用C語言結(jié)構(gòu)體實(shí)現(xiàn)通訊錄

    這篇文章主要為大家詳細(xì)介紹了利用C語言結(jié)構(gòu)體實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 深入解析C++11?lambda表達(dá)式/包裝器/線程庫

    深入解析C++11?lambda表達(dá)式/包裝器/線程庫

    這篇文章主要介紹了C++11?lambda表達(dá)式/包裝器/線程庫的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 基于Qt實(shí)現(xiàn)SVG圖片瀏覽器

    基于Qt實(shí)現(xiàn)SVG圖片瀏覽器

    SVG的英文全稱是Scalable Vector Graphics,即可縮放的矢量圖形。本文將用Qt6制作一個簡單的SVG圖片瀏覽器,感興趣的可以嘗試一下
    2022-06-06

最新評論