C語言中intp與intp的區別

2021-03-07 00:31:01 字數 5940 閱讀 5436

1樓:匿名使用者

經過兩天的上機試驗和自己的推理,我要感謝的是dukehhh同志,我是沿著你的想法推理下去的,你的想法是正確的,而且我還幫你進行了補充:

int *p;是一個指標變數,與之相對應的是int p[n];

int (*p)[4];//是指向一個2維陣列的指標,與之相對應的是int p[4];

int **p;//是指向一個指標的指標 ,與之相對應的是int *p[n],它們都是指向字串的指標陣列,而且二位動態陣列開闢後只能將值賦予它(**p),因為只有它的資料結構才能滿足;

兩個都是指向地址的 。

很多朋友為二維動態陣列的資料結構感到困惑,現在我將我對它的分析先給大家,希望對大家能有一些幫組:

先通過p=(int **)malloc(n*sizeof(int *));相當分配了n個連續的int *型別的記憶體空間,它們的地址是相連的,即p[n]陣列,其型別是int *型別,現在為陣列中的每個變數(p[0]、p[1]、p[2]…p[n-1])賦值,賦的值都是地址值,也就是for(i=0;i

p[i]=(int *)malloc(m*sizeof(int));其中,每個p[n]相當於一維陣列的陣列名,由於記憶體分配函式分配記憶體是隨機的,所以這n個一維陣列並不是相連的,這與二維靜態陣列中的每個一維陣列的地址是相連線的不同。

2樓:匿名使用者

這兩個p的定義是不相容的, 就是說如果你定義一個 int **a , int (*b)[4],他們之間互相賦值必須經過強制型別轉換,否則編譯器通不過。

但是並不是說這兩者之間有多大的差別, 很多時候他們之間的互相賦值是合理的。

我已經說的很清楚了, 型別之間談相等沒有任何意義。 型別之間主要就是相容性, 這兩個按語法規則就是不相容。 至於你說的「含義」相同與否,含義這個東西語法是不認的,含義是不是相同看你腦子裡怎麼想。

要知道,你腦子裡的程式跟編譯器眼裡的東西不是一回事的

3樓:匿名使用者

int (*p)[4];//是指向一個2維陣列的指標int **p;//是一個指標的指標

兩個都是指向地址的

int (*p)[4] 是接收二維陣列的地址(常量)int **p 是接收指標變數的地址(變數)我是這麼理解的,不知道對不。

4樓:百地瓜

不相等,int(*p)[4]是4個指向一唯陣列的指標,int **p是一個指向二維陣列的指標。從定義角度出發是不一樣的

5樓:廣東良民

就像百地瓜說的啊,一般int(*p)[4]要用的時候都是要帶著下標,除了作為實參的時候.

c語言中 int*p[4] 和 int(*p)[4]的區別

6樓:天雲一號

int *p[4]; //定義一個指標陣列,該陣列中每個元素是一個指

針,每個指標指向**就需要程式中後續再定義了。

int (*p)[4]; //定義一個陣列指標,該指標指向含4個元素的一維陣列(陣列中每個元素是int型)。

區分int *p[n]; 和int (*p)[n]; 就要看運算子的優先順序了。

int *p[n]; 中,運算子[ ]優先順序高,先與p結合成為一個陣列,再由int*說明這是一個整型指標陣列。

int (*p)[n]; 中( )優先順序高,首先說明p是一個指標,指向一個整型的一維陣列。

7樓:匿名使用者

int*p[4]是指標的陣列,也就是說它是一個陣列,陣列裡存的是一個個的指標

int(*p)[4]是陣列的指標,也就是說它是一個指標,指向的是一個陣列。指標指向的型別會影響到指標加減運算時地址的位移。比如說有一個陣列 int a[4],加上取址運算子 &a,這個表示式的型別就是指向陣列的指標,可以這樣賦值 p = &a;。

一般用於向函式傳遞二維陣列的時候使用這種型別,這時還有一種更直觀的寫法

void matrix_sum(int matrix_a[4], int matrix_b[4])

這種寫法和

void matrix_sum(int (*matrix_a)[4], int (*matrix_b)[4])

是等價的。

8樓:

int* p[4] // 4個元素的

陣列,元素為int型別的指標

int (*p)[4] // p是一個指標,它指向 4個int型元素的陣列

int (&p)[4] // p是引用, 它引用 4個int型元素的陣列.

9樓:匿名使用者

int *p[4] 是一個存int* 的一維陣列

int (*p)[4] 是一個int 陣列 *p指向a[0]

c語言中 int*p[4] 和 int(*p)[4]的區別是什麼?

10樓:匿名使用者

int*p[4]是指標的陣列

,也就是說它

是一個陣列,陣列裡存的是一個個的指標

int(*p)[4]是陣列的指標,也就是說它是一個指標,指向的是一個陣列。指標指向的型別會影響到指標加減運算時地址的位移。比如說有一個陣列 int a[4],加上取址運算子 &a,這個表示式的型別就是指向陣列的指標,可以這樣賦值 p = &a;。

一般用於向函式傳遞二維陣列的時候使用這種型別,這時還有一種更直觀的寫法

void matrix_sum(int matrix_a[4], int matrix_b[4])

這種寫法和

void matrix_sum(int (*matrix_a)[4], int (*matrix_b)[4])

是等價的。

11樓:望闌珊將盡

結合性不一樣:前者是指標陣列,為4個int指標的陣列,有4個元素;後者是陣列指標,為一個指標,型別為指向包含4個int型別元素的一維陣列的指標。

c語言int (*p)[4]和int *p[4]區別 10

12樓:匿名使用者

int *p[4], 是一個長度為4的指標陣列,陣列的元素為int*;

sizeof(p) => 4*4 = 16;(32位系統一個指標4位元組)

用法:*(p[0])

int (*p)[4] 是一個指向長度為4陣列的指標,即int(*)[4];

其本質是一個指標,如在32為系統上,sizeof(p) => 4用法:(*p)[0].

13樓:一樹的果

第一個是指標陣列,第二個是陣列指標。區別是他是一個指標還是多個指標。

陣列指標只是一個指標變數,似乎是c語言裡專門用來指向二維陣列的,它佔有記憶體中一個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,佔有多個指標的儲存空間。

int (*p)[4]就相當於int p[4],它就是一個二維陣列的指標,可以指向一個第二維度為4的二維陣列

c語言中 int *p[4]和int (*p)[4]什麼區別

14樓:匿名使用者

前者是指標陣列,為4個int指標的陣列,有4個元素

後者是陣列指標,為一個指標,型別為指向包含4個int型別元素的一維陣列的指標

c語言中 int *p[4]和int (*p)[4]在定義和使用方面有什麼區別? o(∩_∩)o謝謝

15樓:勞傷痕

*p[4]這指標陣列,定義一個陣列,裡面存放的是指標。

(*p)[4]定義的是一個指向一維陣列的指標,這是一個指標,p++相當於p的地址相加了1*4

舉例說明:

#include

void main()

,};int *p[4],(*q)[2];

q=a;

p[0]=&a[0][0];

p[1]=&a[0][1];

p[2]=&a[1][0];

p[3]=&a[1][1];

for(int i=0;i<4;i++)

printf("%d\t",*p[i]);

printf("\n");

for(int j=0;j<2;j++,q++)printf("\n");

}}輸出的結果是:

指標陣列:1,2,8,9指標陣列中的每個元素都要給其賦予地址,否則出錯

陣列指標:1,9陣列指標只要開始賦值頭地址,之後執行q++是相加維數,所以結果是1,9而不是1,2

16樓:

//舉例說明:

int *p1[4];//定義指標陣列。這個陣列有四個元素,每個元素都是指向整形變數的指標。

int (*p2)[4];//定義一個指標變數,指向一行有四個整形元素的行指標;

int a[4];

int b[5][4];

的元素分別指向一維陣列a的每一個元素。

p2=b;//p2指向二維陣列b的第一行。

c語言中int *p[5]與 int (*p)[5]的區別

17樓:姓從蓉祕素

你是不想問

int*p[

]和int

(*p)

[]的區別啊[]

的優先順序高於*

所以前者表示指標陣列,而後者是陣列指標,例如int*p[6]

表示p有6個元素,每個元素又是一個int型指標變數。int(*p)[6]表示指向具有6個元素的一維int型陣列的陣列指標變數

18樓:衄潲

樓上說的是錯的,int *p[5],首先

它是一個陣列,它的大小是5,它裡面存放的資料型別是int *,也就是整型指標。 所以它叫指標陣列、 (從右向左解析這個表示)

int (*p)[5],首先p是一個指標,指向大小為5的陣列,因此這叫陣列指標。(括號優先)

這個在《c專家程式設計》裡面說的很清楚。你可以看一下。

19樓:庾詩珊趙寄

int(*p)[4];//是指向一個2維陣列的指標int**p;//是一個指標的指標

兩個都是指向地址的

int(*p)[4]

是接收二維陣列的地址(常量)

int**p

是接收指標變數的地址(變數)

我是這麼理解的,不知道對不。

20樓:貴華燦僧琛

你確定你輸入的語句沒有問題嗎?

int*p();//這是一個整型指標函式,

int(*p)();//這個不能成為語句。

21樓:陳大濤

其實我們先討論一個優先順序的問題,的優先順序高於*,這就是為什麼後者加了一個(),int *p[5]定義一個指標陣列p,講到底這個p是一個陣列,陣列內的元素是5個指標,而陣列內的每一個指標指向一個int型的變數;int (*p)[5]定義了一個指向5個元素的一維陣列的指標。

22樓:匿名使用者

第二個就是這個指標所指的值是一個大小為5個int的陣列的首地址。換句話說,p+1(陣列地址+1)代表記憶體地址下移了5個單位。

23樓:匿名使用者

int *p[5]那麼p[0]是一個int指標

int (*p)[5] 那麼p是一個指向陣列的指標

c語言/指標/ int *p[4]和int (*q)[4] 的含義和區別

24樓:匿名使用者

前者p是一個4個元素的陣列,元素為int *(指向整型資料的指標)變數,p代表陣列名,是地址常量。後者q是指標變數,指向int [4](即含有四個整型元素的陣列)。

25樓:拉丨登

前面是指標陣列,是一個陣列!p裡面裝的是4個指標。後面這個是陣列指標,是一個指標!(意思是一個指向陣列的指標,該陣列有4個元素)

C語言中的intp的理解,int p 怎麼理解啊??

如果要連續定義兩個指標應該是怎樣做呢?如果是第一種理解,則為 int p,q 但是測試結果,p是int指標,而q是int型別,不是指標。所以第一種理解錯誤,實際上要連續定義兩個指標必須 int p,q 所以這樣看第二種理解更靠譜一些,雖然我感覺還是有些牽強,因為這句 而 p為對p取地址,和 抵消了 ...

c語言中與的區別C語言中與的區別

區別 1.運算子性質不同。是一個位運算子。是一個邏輯運算子。2.作用不同。是將兩個二進位制的數逐位相與,結果是相與之後的結果。就是判斷兩個表示式的真假性,只有兩個表示式同時為真才為真,有一個為假則為假,具有短路性質。3.用途限制。除了是一個位運算子,也是取地址符。就是一個單純的邏輯運算子,沒有任何其...

c語言中的char a,b strcpy a,b 與a b有什麼區別

strcpy是拷貝,從b地址開始取字元,一個一個複製到從a開始的地址上。最後你獲得了兩個相同字串,a和b分別指向兩個字串 a b,是修改a的地址,讓a指向b所在的位置。最後你只有一個字串,a和b都指向這個字串。char a,b 說明定義的是兩個char型指標變數 strcpy a,b 此處用法是錯誤...