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

C語言指針的圖文詳解

 更新時間:2022年01月07日 15:04:23   作者:黎丶辰  
這篇文章主要為大家介紹了C語言指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

指針是什么?

指針(Pointer)是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。

換句話說就是可以通過指針找到以它為地址的內(nèi)存單元。

理解:內(nèi)存圖解。

image-20220101191356913

指針是個變量,存放內(nèi)存單元的地址(編號)。

int main(){
    int a = 10;//在內(nèi)存中開辟空間存儲
    int* p = &a;//先對變量a取出它的地址,可以使用&操作。
    			//將a的地址存放在p變量中國,p就是一個指針變量
}

小結(jié):指針就是變量,內(nèi)容是地址。(存放在指針中的值被當(dāng)做地址處理)

指針的大小

  • 在32為計算機上指針大小4字節(jié)。
  • 在64為計算機上指針大小8字節(jié)。

指針和指針變量

關(guān)于地址

printf("%p \n",&a);//%p地址格式   &a取a的地址
int* p = &a;
//int*指針類型 
//p 指針變量 
//&a 取地址

使用

*p //解引用操作符
int a =10;  //在內(nèi)存中存儲10   還有char*等類型
int* p = &a;//定義指針,位置為a的內(nèi)存
*p = 20;    //更改指針指向內(nèi)存的 值
printf("a= %d",a);//結(jié)果為a=20

int* p的理解 p是int類型的一個指針(僅此而已),一般*p指向的也是一個int型的

1. 指針類型決定了指針進(jìn)行解引用操作的時候,能訪問空間的大小

int main(){
    int n = 0x112233;
    char* p = (char*)&n;
    int* pi = &n;
    *pc = 0;  //在調(diào)試的過程中觀察內(nèi)存的變化。
    *pi = 0;
    return 0;
}
int*;  *p可以訪問4個字節(jié)。
char*; *p可以訪問1個字節(jié)。
double*;  *p可以訪問8個字節(jié)。

原因 是類型本身所需的內(nèi)存空間就是指針可以控制的空間。

意義:使用時選用合適的指針類型進(jìn)行定義

2. 指針加減整數(shù)

int main(){
    int a = 0x11223344;
    int* p1 = &a;
    char* p2 = &a;
    printf("%p\n",p1);
    printf("%p\n",p1+1);
    printf("%p\n",p2);
    printf("%p\n",p2+1);
    return 0;
}

image-20220103173241655

int類型時0C->10 變化4, char類型時0C->0D 變化1。

理解:指針加一不是指向下一個緊挨著的地址,是指向下一個指針變量對應(yīng)的類型變量開始的地址。

意義 指針類型決定了:指針走一步走多遠(yuǎn)(指針的步長)

野指針

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

野指針的成因

1.指針未初始化

int main(){    int a;//局部變量不初始化,默認(rèn)是隨機值    int *p;//局部的指針變?nèi)绻麤]有初始化,就被初始化為隨機值。}int main(){
    int a;//局部變量不初始化,默認(rèn)是隨機值
    int *p;//局部的指針變?nèi)绻麤]有初始化,就被初始化為隨機值。
}

2.指針越界訪問

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

3.指針指向的空間釋放

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

解析:在main函數(shù)調(diào)用test()時,進(jìn)入test()函數(shù),int a語句開辟臨時的內(nèi)存空間并將這個內(nèi)存空間存儲為10;返回函數(shù)的時候返回的臨時的a的地址給*p,然后test函數(shù)已經(jīng)在執(zhí)行完test函數(shù)后結(jié)束,a的內(nèi)存空間被銷毀。這時的*p就是指向的地址正確但是內(nèi)容已經(jīng)改變。

將未知位置的值進(jìn)行修改是非常危險的

如何避免野指針

1.指針初始化

2.小心指針越界

3.指針指向內(nèi)存釋放 即 指向NULL

4.指針只用之前檢查有效性

指針運算

1.指針加減整數(shù)

2.指針-指針

3.指針的關(guān)系運算

指針加減指針

int main(){
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    int* p = arr;
    for(int i=0;i<sz;i++){
        printf("%d ",*p);
        p = p+1;// p++
    }
    int* p = &arr[9];
    for(int i=0;i>0;i++){
        printf("%d ",*p);
        p-=1;// p++
    }
    return 0;
}

指針-指針

int main(){
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%d",&arr[9]-&arr[0]);//輸出9   中間元素的個數(shù)。
    printf("%d",&arr[0]-&arr[9]);//輸出-9  
    return 0;
}

指針減指針必須是自己減去自己。否則結(jié)果不可預(yù)知。

指針實現(xiàn)strlen()

int my_strlen(char* str){
    char* start = str;
    char* end = str;
    while(*end != '\0'){
        end++;
    }    
    return ;
}
int main(){
    char arr[] = "hello";
    int len = my_strlen(arr);
    printf("%d\n",len);
    return 0;
}

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

int main(){
    float values[5];
    for(float* vp=&values[5];vp>&values[0];){
        printf("haha ");
        *--vp = 0;
    }
    return 0;
}

這里碰到了兩個問題 1. values[5]本身不屬于數(shù)組的部分。但是可以使用。經(jīng)測試values[5]不會警告,但是values[-1]及以下或values[6]及以上都會報錯。2.指針的加減是類型位置的移動數(shù)組總也就是一個一個往過走。

for(float* vp=&values[5-1];vp>=&values[0];vp--){
    printf("haha ");
    *vp = 0;
}

這里在絕大多數(shù)的編譯器上是可以順利完成任務(wù)的,然而我們應(yīng)該避免這第二種寫法,因為標(biāo)準(zhǔn)不能保證他是可行的。

標(biāo)準(zhǔn)規(guī)定:允許指向數(shù)組元素的指針和指針與指向數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個位置的指針進(jìn)行比較。

指針和數(shù)組

int main(){
    int arr[10]={0};
    printf("%p\n",arr);  //地址-首元素地址
    printf("%p\n",&arr[0]);
}

一般情況數(shù)組名都代表首元素的地址

除了:

1. &數(shù)組名 這時數(shù)組名代表整個數(shù)組的地址

2. sizeof(數(shù)組名) 這時也是代表整個數(shù)組。

二級指針

將第一層指針1想成變量,再取這個變量的地址存為一個指針2。那么指針2指向指針1,指針1指向原變量。原變量的地址存在了指針1中,指針1的地址存在了指針2中。

int main(){
    int a = 10;
    int* pa = &a;
    int** ppa = &pa;//ppa就是二級指針。
    //存在三級及以上指針,(無限套娃)
}

指針數(shù)組、數(shù)組指針

指針數(shù)組其實是個數(shù)組,數(shù)組指針是個指針

指針數(shù)組:存放指針的數(shù)組

int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};//指針數(shù)組

數(shù)組指針:指向數(shù)組的指針。

main(){
int a = 10;
int* pa = &a;
int** ppa = &pa;//ppa就是二級指針。
//存在三級及以上指針,(無限套娃)
}

### 指針數(shù)組、數(shù)組指針

指針數(shù)組其實是個數(shù)組,數(shù)組指針是個指針

<u>**指針數(shù)組**</u>:存放指針的數(shù)組

~~~c
int a = 10;
int b = 20;
int c = 30;
int* arr[3] = {&a,&b,&c};//指針數(shù)組

數(shù)組指針:指向數(shù)組的指針。

總結(jié)

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

相關(guān)文章

  • C++設(shè)計模式之橋接模式

    C++設(shè)計模式之橋接模式

    這篇文章主要介紹了C++設(shè)計模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時候使用橋接模式等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • C++實現(xiàn)多項式相乘

    C++實現(xiàn)多項式相乘

    這篇文章主要介紹了C++實現(xiàn)多項式相乘方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++實現(xiàn)簡單掃雷小游戲

    C++實現(xiàn)簡單掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡單掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++實現(xiàn)堆排序?qū)嵗榻B

    C++實現(xiàn)堆排序?qū)嵗榻B

    大家好,本篇文章主要講的是C++實現(xiàn)堆排序?qū)嵗榻B,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言實現(xiàn)簡單回聲服務(wù)器

    C語言實現(xiàn)簡單回聲服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單回聲服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++實現(xiàn)的歸并排序算法詳解

    C++實現(xiàn)的歸并排序算法詳解

    這篇文章主要介紹了C++實現(xiàn)的歸并排序算法,結(jié)合實例形式詳細(xì)分析了歸并排序算法的原理、實現(xiàn)步驟、操作技巧與使用方法,需要的朋友可以參考下
    2017-05-05
  • c++先序二叉樹的構(gòu)建詳解

    c++先序二叉樹的構(gòu)建詳解

    在本篇文章里小編給大家分享了關(guān)于c++先序二叉樹的構(gòu)建的相關(guān)知識點,需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04
  • C/C++中static,const,inline三種關(guān)鍵字詳細(xì)總結(jié)

    C/C++中static,const,inline三種關(guān)鍵字詳細(xì)總結(jié)

    以下是對C/C++中static,const,inline的三種關(guān)鍵字進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++詳細(xì)講解互斥量與lock_guard類模板及死鎖

    C++詳細(xì)講解互斥量與lock_guard類模板及死鎖

    線程的主要優(yōu)勢在于,能夠通過全局變量來共享信息。不過,這種便捷的共享是有代價的:必須確保多個線程不會同時修改同一變量,或者某一線程不會讀取正由其他線程修改的變量。為了防止出現(xiàn)線程某甲試圖訪 問一共享變量時,線程某乙正在對其進(jìn)行修改。引入了互斥量
    2022-07-07
  • C++繼承中的訪問控制實例分析

    C++繼承中的訪問控制實例分析

    這篇文章主要介紹了C++繼承中的訪問控制,是面向?qū)ο蟪绦蛟O(shè)計中非常重要的知識點,需要的朋友可以參考下
    2014-08-08

最新評論

凉山| 南安市| 大埔区| 鞍山市| 报价| 卢湾区| 安溪县| 龙南县| 永平县| 岳普湖县| 佛学| 前郭尔| 青海省| 德令哈市| 增城市| 长沙市| 雷州市| 佳木斯市| 灵璧县| 昌江| 饶平县| 赤峰市| 阜新| 大埔县| 唐海县| 保山市| 锦州市| 驻马店市| 宽城| 浏阳市| 合水县| 桓台县| 卓尼县| 灌云县| 大关县| 司法| 洞头县| 东方市| 阜城县| 东安县| 容城县|