1樓:時夢
int (*p)[4]=array;
這裡*p是指向陣列的指標,所以在使用時要加兩個*如果想要把p定義為陣列應該用
int p[4]=array;
此時可以直接用
*(p+1)=2;
效果等價於
p[1]=2;
ps:有一點需要注意的是
在C和C++裡,對指標變數的宣告 *和&都是識別符號的一部分=_=我曾經在這裡暈了好久
2樓:屠狗肉夥計
取值也可以這麼理解,但是二維陣列和一維陣列不一樣,因為是二維,所以要解引用兩次,陣列名是const的首個元素位址,+1就是第二列首元素位址,所以可以正常訪問
3樓:繁星雨夜
按照你的定義,p是指向陣列的指標。所以,*p是 int[4]型別的陣列,當然不能賦值int型別的變數。正確的引用應該是*(p+1)[0]
4樓:榮譽
沒必要問為什麼,記住就行了。如果非要問為什麼,就這樣理解:int *p;表示*p是乙個int,那麼int (*p)[4] = array;就表示*p是乙個int [4],即長度為4的整數陣列,也就是array的第乙個元素(也是乙個陣列,即array[0]),那麼*(p+1)就是array的第二個元素(還是乙個陣列,即array[1]),那麼**(p+1)就是array第二行的第乙個元素。
總而言之,記住乙個公式a[i] = *(a+i)。另外,二維陣列的元素是一維陣列。
5樓:「已登出」
樓主,這個是初學指標很頭疼的事情,這個相當於用到了二級指標。
我對指標的理解是這樣的,普通的變數代表乙個值,指標也代表乙個值,只不過代表的是乙個位址值。
你剛開始的想法就是有點問題的,int b=2;這個b是乙個位址儲存的值,不是位址。
那麼int array[3][4];
int(*p)[4]=array;
*(p+1)=2;
就出現了二級指標,我先拿乙個簡單的做個例子。
int a[5];
則a就是元素a[0]的位址,*(a+1),*(a+2)...分別就是a[1],a[2]...的值,那麼你要宣告乙個指標陣列,現在把這個位址也看成乙個值,那麼你宣告的指標就儲存這個位址值,那麼*(p+1)就是array[0][0]的位址,相當於a[0]而不是位址儲存的值,如果要修改a[0][0]的值,你就需要再加乙個指標來取值,也就是**(a+1)。
具體可以看一下這個部落格,雖然有點囉嗦,但是也很詳細。c語言--指標漫談 - 增強哥哥的BLOG - 部落格頻道 - CSDN.NET
6樓:雲天明
在int b;
b = 2;
中,b是乙個「符號」,這個符號,代表,這個函式,在棧幀中預先分配的4個位元組:但是棧幀的位置是由棧指標決定的:這不是絕對位址。
在int* p = &q;
*p = 2;
中,p是乙個int*,&q代表取q這個符號的位址,*p代表用p的值定址。(或者說根據p的值解引用……解引用和定址的意思差不多嘛)
在第三個例子中,p是乙個(int*)[4](行指標),所以*(p+1)
是乙個int[4],或者說,是乙個int,所以要再來一次解引用……雖然解引用後的
**(p+1)
和*(p+1)
是同乙個東西。
不過總的來說你可以用萬能的void*:
*((int*)((void*)(p+1))) = 2其中有一些括號你可以去掉
當然這種東西在我看來,行指標最好不要這樣用,更好的方法是,p[1][0] (p是行指標)
或者*(p+y*width+x) (p是對應型別的指標)
7樓:暮無井見鈴
一元 * (解引用)運算子所作用的是指標型別值,結果是指代該值所指向物件的左值表示式(對於函式指標並非如此)。
粗略來說,對於物件指標,解引用運算子獲得該指標所指向的物件。
它不僅可以作用於指標型別物件(左值),還可以直接作用在指標型別值(非左值)上。
解引用運算子的作用不含取出某個位址中的值。
最好再看下這個。
b 是物件,是一塊資料儲存區域,而且擁有 int 型別。而不是乙個位址。 b 的值是這塊區域中內容按 int 型別解釋的結果。
&b 的值才是你所認為的位址。注意這裡忽略了型別資訊。b=2; 可以認為是「把物件 b 賦值為 2 」,也可以認為是「把位於 &b 的物件賦值為 2 」。
*p = 2; 的意思是將位於表示式 p (int* 型別的位址)的(int 型別)物件賦值為 2 。
然後到 int array[3][4]; int (*p)[4]=array;
這裡有個陣列到指標轉換,array 可以隱式轉換成 int(*)[4] 型別的指標非左值,等於 &array[0] 。
故而 p 指向 array[0] 這個 int[4] 型別陣列物件。
按照指標算術,p+1 指向 array[1] 。
於是 *(p+1) 就是指代 array[1] 這個物件的表示式,其型別是 int[4] 。
陣列型別物件不能被賦值,故 *(p+1)=4 是錯的。
根據陣列到指標轉換,*(p+1) 隱式轉換成指向 (*(p+1))[0] 的 int* 型別指標值,它指向 array[1][0] 。
所以再用一元 * 解引用一次,就得到指代 array[1][0] 的 int 型別左值。
該物件可以用 int 型別的值 2 賦值。
8樓:丁冬
如此來說,*(p+1)=2 這個表示式的作用是修改二維陣列array的第二行第乙個元素的值為2
一直到這句之前都沒什麼大毛病。
然而p的型別是int(*)[4],p+1的型別自然也是int(*)[4],那*(p+1)當然是int[4]
你的前提都沒搞錯,但為啥推論的時候就不按邏輯來了呢Orz
C 中的有符號的字元變數可以儲存 128 127之間的整數,為什麼是 128而不是 127?
undefined 這就涉及到補碼的定義了。signed char在計算機內部是用8位2進製表示的,從0000 0000到1111 1111。如果是unsigned char,0000 0000代表我們通常說的10進製0,1111 1111代表通常說的10進製255。如果不懂的話去搜一下進製轉換。現...
C 中關於List T 和HashSet T 應用的效率問題?
叔本華.com 如果用鍊表,最壞情形是兩個相等元素都在表末尾,每次查詢O n 時間,n次查詢,為O n 2 如果用雜湊表,最壞情形是最後兩次插入的是相同元素,需要n次插入,為O n Elendil Zheng 我覺得一般碼農不懂圖啊這種資料結構還算正常。雜湊錶鏈表都搞不清楚就有點兒。你看每個.net...
C 基本符號運用功能是怎樣的?
這裡涉及到的第乙個問題是 i與i 的區別 i是指將i自增1後返回 i 指先儲存i的當前值,然後i自增1,最後返回先前儲存好的i的舊值比如inti 0 intj i i自增後為1,返回1所以j也為1 intk i i自增後為2,返回i的舊值即k為1 第二個是 的短路求值 比如x y中,如果x為假,整個...