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 一樣。而用 則要宣告一個結構體的指標,還要手動開闢一個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用 正確引用。否...