C語言p ij和p ij的區別問題。萬分感謝

時間 2021-10-30 05:23:12

1樓:匿名使用者

*(p+i)[j]等價於*(p+i+j),進一步等價於p[i+j]

(*(p+i))[j]等價於*(*(p+i)+j),進一步等價於p[i][j]

2樓:大叔iq高

比如*p[j]與(*p)[j]:

第一個是陣列指標,首先p[j]是一個陣列,然後*p[j]就是指向這個陣列的指標。

第二個是指標陣列,首先*p是一個指標,然後這個(*p)[j]陣列中的元素都是指標型別的資料。

3樓:

前者是指標,後者是陣列

有些東西不用太深入,實際運用上很少會用到的··· 估計您是個學生吧?工作後這個問題就不再是個問題了··· 除非您要做的是design而非debuger,而且實際程式中這種東西都是能避則避,所以除非是很特殊的系統,否則要用到這個也很難遇到的

4樓:

*(p+i) [j]分兩步

1.tmp = (p+i)[j

2.return *tmp

(*(p+i))[j] 的兩步

1. tmp = *(p+i)

2. return tmp[j]

具體舉例來說

int a[5] = ;

int *p = a;

int i = 1, j = 2;

則*(p+i) [j] = *(p+1)[2]

1. tmp=(p+1)[2], p先往右移1位,指向a[1],再以a[1]為起點,返回它右邊2位的a[3],因此tmp=a[3]

2. 返回*tmp也就是*a[3],a[3]本身在這裡並不是指標,因此*a[3]在這裡沒有任何意義,編譯器會報錯。

可以想見,這一用法必須用於陣列元素全部是指標的情況中,這樣a[3]本身才會是指標,*a[3]才有意義。

而 (*(p+i))[j] = (*(p+1))[2]

1. tmp = *(p+1), p+1指向a[1],*(p+1)就是a[1]本身

2. return tmp[j],也就是返回a[1][2],在這裡a並不是二維陣列,因此a[1][2]也毫無意義,繼續報錯。

可以看出,這一用法必須用於二維陣列。

5樓:雋風

*(p+i) [j] = *((p+i)[j])

c語言問題。 *p+i與*(p+i)有什麼區別啊?

6樓:匿名使用者

寫個c程式解釋吧。

#include

int main()

, *p = a;

printf("%d %d\n", *p + 1, *(p + 3));

return 0;

}輸出為 10 6;

為什麼呢?因為 *p = a 把 a 陣列的首地址的值放在 p 處,所以p = a,*p =a[0]= 9 => *p + 1 = 9 + 1 = 10.

p + 3 就是a陣列的首地址往後移動3位,即p = a[0], p + 3 = a[3]的值,就是6了。

7樓:匿名使用者

其實在定義時你這樣理解就很清楚答案了:

char *p;理解成char (*p);*p在一起是一個char。那麼,*p+i就是*p的值加上i,而*(p+i)是在先p+i再*操作,*是什麼意思呢,在這裡是「取值」。所以,*(p+i)是把指標移動i個位置,再返回前地址的值。

8樓:匿名使用者

地址加i,地址變了。地址

c語言中如(*p)[3]如果出現這*(*(p+i)+j)兩個*是什麼意思啊,求解啊

9樓:

p為指向3個元素的一維陣列的指標

p+i表示第i個包含3個元素的一維陣列的首地址*(p+i),對p+i解引用,得到p+i的內容,為一維陣列p+i的首元素的首地址

*(p+i)+j,一維陣列p+i的第j個元素的地址*(*(p+i)+j),一維陣列p+i的第j個元素的內容如果p指向一個二維陣列a[i][j],那麼*(*(p+i)+j)等價於a[i][j]

10樓:

//舉例說明。

int a[2][3]=;

int (*p)[3]=a; //p的型別與a相同,這兒表示p指向陣列第一行。

printf("%d\n",*(*(p+1)+1)); //*(*(p+1)+1)等價於a[1][1],這兒的值為5。

11樓:匿名使用者

我們這樣來看

int arr[3] 這是一個大小為3的整型陣列那麼int (*p)[3] 這就是一個指向上述陣列的指標所以p+i也是一個指向上述陣列的指標,即 *(p+i) 和上述陣列是同型別的

那麼 *(p+i)+ j 你就可以看成是 arr + j 了,就是指向上述陣列第j個位子的指標,接著就是*號取值了

*(*(p+i)+j)

12樓:小玉是我老婆

定義二維陣列:int a[i][j];

定義一個指標:int *p;

p=a;

p+i:是第i行的首地址.

*(p+i)是第i行第0列元素的地址.

*(p+i)+j是第i行第j列元素的地址.

*(*(p+i)+j)是第i行第j列元素所對應的值.

13樓:匿名使用者

多維陣列的地址

設有整型二維陣列a[3][4]如下:

0 1 2 3

4 5 6 7

8 9 10 11

它的定義為:

int a[3][4]=,,}

c語言允許把一個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0],a[1],a[2]。每一個一維陣列又含有四個元素。

例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。

陣列及陣列元素的地址表示如下:

從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首地址,也是二維陣列0行的首地址,等於1000。a+1代表第一行的首地址,等於1008。如圖:

a[0]是第一個一維陣列的陣列名和首地址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]0 號元素的首地址,也為1000。&a[0][0]是二維陣列a的0行0列元素首地址,同樣是1000。

因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。

同理,a+1是二維陣列1行的首地址,等於1008。a[1]是第二個一維陣列的陣列名和首地址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素地址,也是1008。

因此a+1,a[1],*(a+1),&a[1][0]是等同的。

由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。

此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的地址,不存在元素a[i]。c語言規定,它是一種地址計算方法,表示陣列a第i行首地址。

由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。

另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首地址,而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首地址,它等於&a[i][j]。

由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首地址,所以,該元素的值等於*(*(a+i)+j)。

14樓:匿名使用者

第一個回答有問題!大家一定要注意了!int*p[j]才是正確定義二維陣列的指標的方法。

15樓:★凌霜劍

陣列指標表示二維陣列,*(*(p+i)+j)是第i行第j列對應的元素的值

16樓:可愛的小知道

這個你在譚浩強c語言教程中,"二維陣列"的介紹裡有詳細解說.哈哈哈.

17樓:匿名使用者

是一個二維指標,相當於陣列p[i][j];

*p+i和*(p+i)有什麼區別啊?新人求解……

18樓:田真久

p如果是陣列的指bai

針,指向的是數du組的第一個元zhi素,也就是說daop就是第一個元內素的地址,因此容以為陣列裡面*p代表第一個元素的值,*p+i 代表第一個元素的值+i,而*(p+i)代表陣列的第i個元素的值。

二維陣列裡面*p指向這個二維陣列的第一個一維陣列,*p+i 就是把這個地址偏移i;

*(p+i)是指向二維陣列的第i個一維陣列。

19樓:匿名使用者

一維陣列來裡也不可能自等價

+是一個雙目運算子

所以*p+i是要先算*p的,然後把值加上i而*(p+i),先算的p+i,就是指向了一個新的位置,然後再*,這樣就取了新的那個位置的值。

於是,這個問題前提就錯了,我只能解答到這裡了。

20樓:匿名使用者

在一維陣列裡面抄,貌似*p+i和襲*(p+i)等價。//不正確bai比如du,int a[5],*p; p=&a[1];

*p+i,相當於

zhia[1]+i

*(p+i),相當於a[i]

在二維陣列裡面,dao貌似*p+i和*(p+i)不等價。//正確

c語言中*p+i和*(p+i)有什麼不同

21樓:匿名使用者

*p+i : *的優先順序高於+,所以先計算*p,即取用指標p指向的記憶體中的資料,然後將該資料和i相加

*(p+i): 先計算括號中的p+i ,即將指標p向後移動i個位置,然後做*運算取用其中的資料

22樓:calm朋朋

第一個p的值加i

第二個表示(p+i)地址的值

請問c++中指標與二維陣列,下面圖中程式裡的 *(p+i*3+j) 是什麼意思啊? 謝謝 20

23樓:匿名使用者

這個利用的是二維陣列還是順序儲存的特點來直接計算a[i][j]的儲存位置

*(p+i*3+j)就是a[i][j],因為p是指向首元素的元素指標,a每行有3個元素,這樣a[i][j]按行優先儲存時,和a[0][0]差了這麼多個元素:i*3+j

a[0] 就是a[0][0]的地址

24樓:匿名使用者

*(p+i*3+j) 相當於 a[i][j]

c語言的指標問題。*(p+i)是代表取值呢還是取地址?

25樓:匿名使用者

定義int *p=a,那麼p+0就是

a[0]的首地址,

p+i就是a[i]的首地址,p+2就是a[2]的首地址,*(p+0)就是a[0][0]的地版址,*(p+1)就是a[1][0]的地址,*(p+2)就是a[2][0]的地址;而定義權int (*p)[4];代表p是一個陣列指標,指向一個4個 int大小的陣列,此時p=a之後,p就是一個指向sizeof(int)*4這麼大小的空間了,*(p+0)就是a[0]行的地址了,*(p+1)就是a[1]行的地址了,所以*p和(*p)[4]不是同一個指標,他們指向空間的的大小不一樣。

26樓:匿名使用者

首先,你應該明確指bai針dup的型別,是int *p 還是 int ** p,兩者都可zhi以指向陣列a的首地址dao。

如果你定義 int *p[4],這是版一個指標陣列,權那麼p實際上是一個常量。 *(p+i)與p[i]的意義一樣,是一個指標,或者說是陣列p中的一個元素。這個p與a看不出任何聯絡的。

27樓:匿名使用者

int *p=a

這是定自義指標,表示p是a[0][0]的地址,*(p+i)代表的是a[0][i]的值,

int (*p)[4]

定義一個陣列指標,*(p+i)就是a[i][0]的地址,*(*(p+i)+j)是a[i][j]這個值

C語言的問題,fread和fgets的區別是什麼

夜禮服假面 fread和 fgets的區別 fread 以位元組位計算長度,按照指定的長度和次數讀取資料,遇到結尾或完成指定長度讀取後停止.fgets 整行讀取,遇到回車換行或結尾停止.在文字方式時使用.讀字串函式fgets函式的功能是從指定的檔案中讀一個字串到字元陣列中,函式呼叫的形式為 fget...

C語言問題 s a和s s a的區別?謝謝

聽不清啊 s a比s s a執行的效率要高一些,執行效果是一樣的。 從結果上看是一樣的,但是底層實現上,第一種寫法的效率要高一點。第一種寫法相當於先把a的值取出來,再加到s當中 而第二中寫法是分別將s,a取出來再做加法,結果再存回s裡面。 你看嘛如果用第一個語句,迴圈到n 99 1的時候 這時求了1...

c語言中 》和 的區別,c語言中 a a 和 a 的區別

1 指向不同 一般情況下用 只需要宣告一個結構體。格式是,結構體型別名 結構體名。然後用結構體名加 加域名就可以引用域 了。因為自動分配了結構體的記憶體。如同 int a 一樣。而用 則要宣告一個結構體的指標,還要手動開闢一個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用 正確引用。否...