我有一個簡單的問題。我是 C 中的指標新手,我不明白為什么這是有效的,我可以更改指標的值
int main()
{
int x = 7;
int *aptr = &x;
printf("%d",*aptr);
*aptr = 21;
printf("%d",*aptr);
}
但這不會列印任何數字
int main()
{
int x = 7;
int *aptr = 21;
printf("%d",*aptr);
}
感謝幫助!
uj5u.com熱心網友回復:
int *aptr = 21;不存盤21在*aptr. 當=在宣告被使用,它設定了的東西為初始值進行宣布(這是aptr),而不是用于宣告“表達畫面”( *aptr)。
在 C 宣告中,我們使用一種型別的圖片來描述型別。通常,在像 一樣的宣告中,給出了我們將用作. 例如,say will 是 an ,因此它宣告為指向 an 的指標。另一個例子是say will be an ,所以它宣告為一個陣列。請注意,這些是宣告, not or ,因此,當給出初始值時,它用于初始化, not or 。int declaratordeclaratorintint *foo*foointfoointint foo[3]foo[i]intfoointfoo*foofoo[i]foo*foofoo[i]
21不是指標的正確值,因此編譯器會抱怨。(可以使用強制轉換將整數轉換為指標,但這是一個特殊用例,需要確保整數表示在 C 實作中可用的地址。)
uj5u.com熱心網友回復:
雖然其他人為您的問題提供了正確答案,但獲得該答案的最佳方法是讓編譯器告訴您問題是什么。例如,當您使用 gcc(大多數 Linux 機器上的默認編譯器)編譯程式時,您會得到:
$ gcc -o prog prog.c
prog.c: In function ‘main’:
prog.c:6:17: warning: initialization of ‘int *’ from ‘int’ makes pointer
from integer without a cast [-Wint-conversion]
6 | int *aptr = 21;
| ^~
...這基本上就是@EricPostpischil 告訴你的:-)
Microsoft 的 Visual C 也會說類似的話(godbolt.org)。
因此,閱讀編譯器生成的警告非常重要!
此外,您應該考慮在啟用其他編譯器警告標志的情況下進行編譯。在這里閱讀:
為什么我應該總是啟用編譯器警告?
uj5u.com熱心網友回復:
變數不是值的指標存盤地址。在這里,您宣告int *aptr為整數指標,這意味著它將存盤任何整數變數的地址,而不是整數。
int x = 7; // x is an integer variable.
int *aptr = 21; // aptr is an integer pointer.
你應該寫:
int *aptr = &x;
1X
____ ____
aptr | 1X | ----------> x | 7 |
aptr 指向 1X,它是整數變數 x 的地址。
uj5u.com熱心網友回復:
因此,您當前將存盤在 aptr 中的地址設定為21。
這相當于設定:
int a = 7;
int *aptr = 0xFFFFFFFF //this could be a memory address
您已簡單地將 aptr 指向的內容分配為記憶體地址 7,但您不知道此地址中存盤了什么(或者它是否在范圍內),因此這就是您收到錯誤的原因。
要了解有關指標的更多資訊,請嘗試查看這篇文章:https : //www.tutorialspoint.com/cprogramming/c_pointers.htm
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364682.html
上一篇:從套接字讀取時的意外行為
