關於C中的符號 ?

時間 2021-05-11 23:40:51

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為假,整個...