如何理解C語言中的 p和 p 和 p

時間 2021-06-01 03:07:45

1樓:諾坎普奇蹟

*name為陣列指標(陣列本身就是一種特殊的指標),而P為位址的位址,因為指標可以進行移位運算,所以可以直接運算;確實等同於p =name[i];第二個a為陣列頭指標的位址,&a則為儲存陣列頭指標位址的位址,p為陣列a[4]的位址,故可以賦值p=&a

2樓:冒泡

file 1

name的型別是char *[3],雖然你沒寫3,但是後面給了3個初始化的值,就相當於寫了3了

然後,陣列型別可以隱式轉換為其第一維度元素的指標,char *[3]的元素型別是char *(砍了第乙個方括號就是),所以可以轉換為char **

name做加法的時候就是做這個轉換,然後指標和整數相加,型別還是原指標型別,所以當然能賦值給p,因為p正是char **

name+i並不是name[i],應該是&name[i]file 2

a的型別是int[4]

對a取位址就是指向int[4]的指標,也就是int(*)[4]p正是int(*)[4]

3樓:C語言答疑課堂

我來回答第乙個問題吧。第乙個問題其實就是指標的指標與指標陣列的概念,確實比較難以理解。

1.先來說這個name陣列,也就是指標陣列。

從定義的語法上看,乙個*,乙個name,乙個[ ],按照運算子優先順序來結合,那麼name先和[ ]結合,變成name[ ],這就是陣列的意思,說明name是乙個陣列名,接著再與*結合,告訴你name這個陣列啊,它的元素都是指標,因此,我們可以把name陣列分解如下:

char *p1, *p2, *p3;

p1 = "abc";

p2 = "edf";

p3 = "ghi";

*name=;//p1,p2,p3都是指向字串的指標。這裡寫法不嚴謹,僅僅幫助理解而使用

既然p1是陣列name的第乙個元素,那麼name的值就是元素p1的位址,name + 1就是元素p2的位址,name + 3就是元素p3的位址。

你想啊,p1是指標,說明p1的值是「abc」這個字串的位址,那麼,也就是name是字串「abc」這個字串的位址(p1)的位址(p1的位址,即name + 1)。

2.再來說說位址的位址p

**p本身就是位址的位址的意思,那麼name + i與p就臭味相投,彼此間就能賦值了。

name[1]是p2的值,*name是p1的值,與p不是乙個數量級,所以不能賦值。

關於指標的概念,確實不太好理解,我之前自己總結了乙個指標理解的方法,有興趣的話可以參考:

從四個屬性的角度來理解C語言的指標也許會更好理解 - 知乎專欄

這樣子來理解C語言中指標的指標 - 知乎專欄

4樓:韓藝俊

//指標與陣列指標的自加和移位的問題

//初始他如下:

int a[10];

int *p;

p = &a[0]; //因為a是首位址,所以可以寫成p = a;

1. p+n; p+n 和 a+n表示陣列元素a[n]的位址,即是&a[n]; p+1表示同乙個陣列下乙個元素的位址;位址的值需要根據陣列元素的型別來計算,公式為「位址 = p + n*d」 n是接下來的第幾個指向,d是指元素型別所佔的位元組數。

(只有指標變數可以實現本身的改變,所以p++合法,而a++不合法,因為a是陣列名,是首位址,是常量)

2. *(p + n) 和 *(a + n),因為 " * "是取值符號,所以根據1易知表示 a[n]的值。

因為 " ++ "和 " * "是同一優先順序,結合方向自右至左。所以

(1) *p++ 等價於 *(p++)

(2) (*p)++ 表示p所指向的元素值加1,先取值再加1

(3) ++*p 則就是 ++(*p) 所指向的元素先加1後再使用,與(2)類似,可以做比較

5樓:Toykee

FILE1:

要不要我把格式改一下?

char* name[ ] = ;

//名叫name的char*型別陣列,資料型別為(char*)[ ]

char** p;

int i;

首先糾正乙個錯誤,即與p = name + i邏輯等價(結果一致)的是p = &name[i]

對於p = *name + i:

左邊的p是char**,右邊的name是(char*)[ ],則*name是char*,加個i後的*name + i還是char*,兩邊的資料型別都不同,邏輯上這個賦值當然有問題

對於*p = name + i:

這時左邊是char*右邊是char**,同理

這裡注意一點:若p未初始化(賦值),則*p操作本身就非法,編譯階段就會報錯

FILE2:

int a[4] = ;

int (*p)[4];

//名叫p的int[ ]型別指標,資料型別為(int[ ])*

對於p = &a:

左邊p是(int[ ])*,右邊a是int[ ],&a就是(int[ ])*,左右資料型別相同,可賦值,即讓p指向a

對於p = a:

不用再解釋了吧

至於為什麼編譯均可通過、只是警告

那是因為指標也是一類特殊的int變數啊,不管是什麼型別的指標,存放的都是記憶體位址(可以用%X格式print乙個指標看看)而已。給指標定義型別無非是打個標籤,標明這個指標只能存放哪些資料的位址

反正都是記憶體位址那幾位十六進製制數,那不同型別的指標之間當然可以賦值啦

可是只有編譯器才知道,這種賦值在邏輯上是有問題的

6樓:

p是變數位址,所以不能對其進行直接賦值,*p才是你所需要賦值的變數。 所以*p=name+i或者p=*name+i在邏輯上不成立。

當你定義了乙個陣列後,系統會預設分配乙個連續的區域給你,而對位址進行加減,也就能把陣列的對應的變數進行相應的賦值。

p=name[i]邏輯上能成立的原因是陣列名具有雙重身份,它可以直接進行賦值,也可以作為指標用。而指標的用法則比較嚴苛。

其次p=&a是對a進行取位址,所以達到了進行把a的值賦給*p的目的。這也是p=a錯誤的原因

如何評價華為P40Pro和P40Pro ?

光速大聖 P40Pro 超感知徠卡四攝 5000萬畫素超感知攝像頭 廣角,f 1.9光圈,OIS光學防抖 4000萬畫素電影攝像頭 超廣角,f 1.8光圈 1200萬畫素超感光長焦攝像頭 f 3.4 光圈,OIS光學防抖 3D深感攝像頭後置攝像頭變焦模式 支援5倍光學變焦 5倍變焦為近似值,鏡頭焦段...

如何看待華為P9和P9 Plus GPS漂移問題?

傲來國石中生 2016年6月份買的P9,使用剛出廠版本時候的GPS,無論是跑步軟體記錄軌跡還是開車導航都非常的好用。搜星定位非常的快,至少比我之前的三星note3要快的多。之後手機開始推送公升級系統,GPS導航的功能就越來越差。現在EMUI的版本是8.0,版本號是EVA AL10 8.0.0.540...

該不該相信信和財富的p2p?

現在看來基本已經是要死的邊緣了 昨天才知道家裡也投了信和,而且逾期接近半年沒有還,在這種情況下立去查一下 結果。乖乖個懂。整個公司就乙個夏靖?這什麼鬼。各地出現人去樓空,而且法人也被限制消費,基本可以確定處於馬上就要死了 表面看起來很穩,其實內心已經慌得一B 楊生 怎麼說吧,記住要投先看公司水平吧成...