C語言裏指針相加沒有物理意義,那結構指針裏的成員可以相加計算嗎?
例如:
代碼寫的不錯,就是需要用malloc為這個結構體創建內存空間。
p=malloc(sizeof(date));
然後就都對了 p是指針 *p就是內存實體了!
你這寫的什麼呀……完全不知道你要表達什麼。定義了一個結構體類型後,下面沒有結構體的實例,就要操作結構體指針裏的成員是什麼意思?你要測試非法地址訪問嗎?
指針指向什麼東西是與指針無關的, 如果指針指向的數據可以直接進行某種操作, 那麼當然可以把指針解引用後進行這種操作, 也就是說題主這麼做是完全可以的.
另外, 指針, 類型這些概念只是對數據的一種解釋罷了, 指針本質上只是一個整數, 我們甚至可以搞這樣的騷操作(64位的環境下):
int target = 0;
long long ptr = target; // 注意這裡不是int*或者long long *
printf("%d
", *(int*)ptr); // 把ptr解釋成一個指向int的指針
之所以說指針相加沒有意義, 是因為對地址的操作邏輯上只有這幾種, 容不下加法的位置:
- 取得相對一個地址有一定偏移的一個新地址(指針 整數)
- 取得兩個地址之間的相對偏移(指針-指針)
- 取得一個地址指向的內容
以下是對C(和題主)的吐槽:
- C有個運算符叫
-&>
, 比如p-&>a
就是(*p).a
, 就是用來當這種非常常見的操作的語法糖的 - 但是這個運算符顯得有些多餘, 因為pascal的指針語法是這樣的:
p^
表示解引用,p^.a
就是C的p-&>a
了, 雖然^
被C用了, 但鍵盤上還有@
和$
c/c++直到現在還沒碰...
不能計算,因為指針是保存的地址,沒有實例,所以即便計算地址,也無從考證
用指針要用new, date* p = new date();
不然你哪個p指哪裡去了???
用指針,可以用這個操作符-&>
p-&>stock = p-&>sales + p-&>last;
記得用完delete p;
指針相加、相減是有意義的,相乘和相除是沒有意義的。
你這都是在哪學的,看這嚇人!!
看下我自己理解寫的:
C/C++語言 - 梁筆記?zouzhongliang.com
你定義了一個結構體,它可以理解為是一個類型(實際上就是類型),有了類型之後還需要用這個類型定義一個變數,例如int a;這種,結構體也是一樣。
推薦閱讀: