簡體   English   中英

C程序中的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM