中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C語言基礎(chǔ)知識最核心的指針知識總結(jié)第一部分(頁內(nèi)代碼可以復(fù)制)

https://www.toutiao.com/article/7146467812674994724/?log_from=83a3d53786d16_1665389494276


    (頁內(nèi)代碼可以復(fù)制)


指針是C語言最重要也是最難理解的部分,它在我們平時的工作中無處不在。

有人說學(xué)會了指針,C語言也就學(xué)會一半。為什么說指針難。因?yàn)橹羔樑c數(shù)組相結(jié)合就涉及數(shù)組指針與指針數(shù)組。指針與結(jié)構(gòu)體結(jié)合就涉及結(jié)構(gòu)體指針。指針與字符結(jié)合涉及字符指針。指針與const結(jié)合涉及常量指針與指針常量。指針與函數(shù)結(jié)合涉及函數(shù)指針與指針函數(shù),同時也會涉及回調(diào)函數(shù)。指針和指針結(jié)合涉及到二維指針。

作者曾經(jīng)因?yàn)樯厦娴倪@些問題,困擾了許久。因而在網(wǎng)上找了許多的博客來解答疑惑。這篇文章,我試圖將上面的知識點(diǎn)以例子的方式呈現(xiàn)給大家,我相信通過閱讀本文,大家會對指針有更深一步的了解。文中涉及的例子均來源于網(wǎng)上。

1 指針的定義

我們知道,普通的變量存儲的是一個值。而指針變量,它存儲的也是一個值,只是這是一個特殊的值:它的值是另一個變量的地址。

指針的定義形式如下:

datatype *name;
或 
datatype *name = value;

其意思就是name是一個指針,它指向的是一個類型為dataype的地址。

指針存儲的是一個地址,如果需要獲取這個地址對應(yīng)的內(nèi)容,可以通過解引用符*獲取:

int a = 12;
int *pa = &a;
printf("*pa:%u.", *pa); // 輸出是12;
*pa = 14; // 此時a的值為14了

這里需要注意的一點(diǎn),也是我以前經(jīng)常迷惑的一點(diǎn):定義指針時,編譯器并不為指針?biāo)赶虻膶ο蠓峙淇臻g,它只是分配指針本身的空間,除非在定義時同時賦給一個字符串常量進(jìn)行初始化。比如:

int *a;
...
*a = 12;

上面這個代碼段說明了一個極為常見的錯誤:我們聲明了這個變量,但從未對它進(jìn)行初始化,所以沒法預(yù)測12這個值將存儲于什么地方。如果變量是靜態(tài)的,它會被初始化為0,;如果變量是自動地,它根本不會被初始化。無論哪種情況,聲明一個指向整型的指針都不會"創(chuàng)建"用于存儲整型值的內(nèi)存空間。

但是, 下面的定義創(chuàng)建了一個字符串常量(為其分配了內(nèi)存):

char *p = "breadfruit";

始化指針時所創(chuàng)建的字符串常量被定義為只讀。如果試圖通過指針修改這個字符串的值,程序就會出現(xiàn)未定義的行為。

除了上述的定義是對的外,其他的定義都是錯誤的:

float *pip = 3.14; // 錯誤!無法通過編譯

2 指針的運(yùn)算

指針 +(-) 整數(shù)指針存儲的是一個地址,這個地址本質(zhì)上是一個整數(shù),所以可以加上或減去一個整數(shù)。但是它不是普通的加法或減法,指針加上或減去一個整數(shù)結(jié)果是另一個指針。但是,運(yùn)算后的指針指向哪里呢?當(dāng)一個指針和一個整數(shù)執(zhí)行算術(shù)運(yùn)算時,整數(shù)在執(zhí)行加法(減法)運(yùn)算前會根據(jù)合適的大小進(jìn)行調(diào)整。這個"合適的大小"就是指針?biāo)赶蝾愋偷拇笮。?調(diào)整"就是把整數(shù)值和"合適的大小"相乘。

#include <stdio.h>
int main()
{
    int a = 10;
    int *pa = &a;
    
    double b = 99.9;
    double *pb = &b;
    char c = '@';
    char *pc = &c;
    printf("sizeof(int)= %u, sizeof(double)=%u, sizeof(char)=%u\n",
        sizeof(int), sizeof(double), sizeof(char));

    //最初的值
    printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);
    printf("pa=%p, pb=%p, pc=%p\n", pa, pb, pc);

    //加法運(yùn)算
    pa++; pb++; pc++;
    printf("pa=%p, pb=%p, pc=%p\n", pa, pb, pc);
    //減法運(yùn)算
    pa -= 2; pb -= 2; pc -= 2;
    printf("pa=%p, pb=%p, pc=%p\n", pa, pb, pc);
    return 0;
}

運(yùn)算結(jié)果:

sizeof(int)= 4, sizeof(double)=8, sizeof(char)=1
&a=000000000061FE04, &b=000000000061FDF8, &c=000000000061FDF7
pa=000000000061FE04, pb=000000000061FDF8, pc=000000000061FDF7
pa=000000000061FE08, pb=000000000061FE00, pc=000000000061FDF8
pa=000000000061FE00, pb=000000000061FDF0, pc=000000000061FDF6

由上面的結(jié)果可以看到,當(dāng)對指針pa,pb,pc進(jìn)行加1時,實(shí)際地址增加的是對應(yīng)類型的大小。減法也一樣。

指針 - 指針

只有當(dāng)兩個指針都指向同一個數(shù)組中的元素時,才允許從一個指針減去另一個指針。兩個指針相減的結(jié)果是兩個指針之間的元素個數(shù)。比如,如果p1指向array[i]而p2指向array[j],那么p2-p1的值就是j-i的值。如果兩個指針?biāo)赶虻牟皇峭粋€數(shù)組中的元素,那么它們之間相減的結(jié)果是未定義的,也是毫無意義的。

3 指針與數(shù)組

3.1 數(shù)組指針(指向數(shù)組的指針)

數(shù)組指針,它是一個指針,指向的是一個數(shù)組。即它存的是一個數(shù)組變量的地址。所以這個指針每加一步的步長就是數(shù)組的長度。由于它每跨一步都是整個數(shù)組,所以又稱行數(shù)組。

#include <stdio.h>
int main()
{
    int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
    int (*pa)[4];
    pa = a;
    printf("a:%p, &a:%p, &a[0][0]:%p\n", a, &a, &a[0][0]);
    printf("pa:%p, (*pa)[0]:%u\n", pa, (*pa)[0]);
    pa++;
    printf("&a[1]:%p, &a[1][0]:%p\n", &a[1], &a[1][0]);
    printf("pa:%p, (*pa)[0]:%u\n", pa, (*pa)[0]);
    return 0;
}

運(yùn)行結(jié)果:

a:000000000061FDE0, &a:000000000061FDE0, &a[0][0]:000000000061FDE0
pa:000000000061FDE0, (*pa)[0]:1
&a[1]:000000000061FDF0, &a[1][0]:000000000061FDF0
pa:000000000061FDF0, (*pa)[0]:5

首先,pa是一個數(shù)組指針,它首先存的是數(shù)組a的首元素的地址,由于數(shù)組名也是數(shù)組的首地址,所以a, &a, &a[0][0]的地址相同。pa中存的也是這個地址。然后對pa進(jìn)行解引用,*pa之后得到這個數(shù)組,然后(*pa)[i]就是獲得這個數(shù)組下標(biāo)為i的元素。

3.2 指針數(shù)組

指針數(shù)組,它本質(zhì)上是一個數(shù)組,只不過整個數(shù)組存的類型是一個指針而已。

#include<stdio.h> 

int main(void)
{
    char *p1 = "Himanshu";
    char *p2 = "Arora";
    char *p3 = "India"; 

    char *arr[3]; 

    arr[0] = p1;
    arr[1] = p2;
    arr[2] = p3; 

   printf("\n p1 = [%s] \n",p1);
   printf("\n p2 = [%s] \n",p2);
   printf("\n p3 = [%s] \n",p3); 

   printf("\n arr[0] = [%s] \n",arr[0]);
   printf("\n arr[1] = [%s] \n",arr[1]);
   printf("\n arr[2] = [%s] \n",arr[2]); 

   return 0;
}

運(yùn)行結(jié)果:

p1 = [Himanshu]

p2 = [Arora]

p3 = [India]

arr[0] = [Himanshu]

arr[1] = [Arora]

arr[2] = [India]

4 指針與字符

在C語言中,表示字符串一般有兩種形式,一種是數(shù)組的形式,一種是字符指針的形式。

數(shù)組形式:

char arr[] = "hello,world";

字符指針形式:

char *str = "hello,world";

雖然上面兩種形式都能表示字符串,但是它們還是有些區(qū)別的:

存儲方式字符數(shù)組由若干元素組成,每個元素存放一個字符,而字符指針變量只存放字符串的首地址,不是整個字符串。

存儲位置。數(shù)組是在內(nèi)存中開辟了一段空間存放字符串, 是存在棧區(qū)。而字符指針是在字面值常量區(qū)開辟了一段空間存放字符串,將字符串的首地址付給指針變量str。

賦值方式。對于數(shù)組,下面的賦值方式是錯誤的:

char str[10];
str="hello"; // 錯誤!

而對字符指針變量,可以采用下面方法賦值:

char *a;
a = "hello";

可否被修改。指針變量指向的字符串內(nèi)容不能被修改,但指針變量的值(即存放的地址或者指向)是可以被修改的。

來源:稀土掘金,作者:Elec


對啦對啦!另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語言的道路上披荊斬棘!可以來我粉絲群領(lǐng)取哦~

編程學(xué)習(xí)書籍分享:

編程學(xué)習(xí)視頻分享:

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)最重要的是你可以在群里面交流提問編程問題哦!

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
UC頭條:[C語言]帶你徹底理解指針(詳解)
指針
字符串?dāng)?shù)組初始化 - 有緣人共聚一堂 - 博客園
字符串文字量
指針數(shù)組與數(shù)組指針詳解
指針與二維數(shù)組
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服