[英]Pointers in C-Program
我有一個關於 C 中指針的問題。例如:
int data[SIZE] = {2,4,5,1,0};
int *p = &data[2];
int **s=&p;
p++;
printf("%p ", *s);
這里的指針*s 是否等於*p,即*s 的地址是否等於*p?
*這可能是一個簡單的問題,但我們沒有花足夠的時間學習 C
在聲明之后,您有以下內容:
s == &p // int ** == int **
*s == p == &data[2] // int * == int * == int *
**s == *p == data[2] == 5 // int == int == int == int
在p++
:
*s == p == &data[3]
**s == *p == data[3] == 1
如果你跑
int data[5] = {2,4,5,1,0};
int *p = &data[2];
int **s=&p;
p++;
int data[5] = {2,4,5,1,0};
int *p = &data[2];
int **s=&p;
p++;
printf("*p: %d \n", *p);
printf("&p: %p \n", &p);
printf("s: %p \n", s);
printf("*s: %p \n", *s);
printf("**s: %d \n", **s);
你會得到:
*p: 1
&p: 0x7ffc69a74650
s: 0x7ffc69a74650
*s: 0x7ffc69a7466c
**s: 1
這表明*p
和**s
指向的值是相同的 (1),也是&p == s
但&p
和*s
不一樣,因為有一個額外的“步驟”。
這是您程序的可能執行:
int data[SIZE] = {2,4,5,1,0};
// your memory looks like this:
// Address (name) -> Value
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
int *p = &data[2];
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x88
int **s=&p;
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x88
// 0xD8 (s) -> 0xC0
p++;
// 0x80 (data[0]) -> 2
// 0x84 (data[1]) -> 4
// 0x88 (data[2]) -> 5
// 0x8C (data[3]) -> 1
// 0x90 (data[4]) -> 0
// 0xC0 (p) -> 0x8C
// 0xD8 (s) -> 0xC0
printf("%p ", *s); //Will print 0x8C
所以不,*s(s 指向的值)將不等於 *p(p 指向的值)而是等於 p(p 指針的地址)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.