星星,滿天的星星,星星飛滿天
原版是參考:http://www.java2s.com/Code/C/Pointer/Pointerspointervalue.htm
小改一下。
#include <stdio.h>
int main(void)
{
int x, *p, **q,***r;
x = 10;
p = &x;
q = &p;
r= &q;
printf("%d", **q); /* print the value of x */
printf("%d", ***r); /* print the value of x */
return 0;
}
延續昨晚的練習。
昨天trace了一下。今天再trace。
Breakpoint 1, main () at pointer01.c:7
7 x = 10;
(gdb) n
8 p = &x;
(gdb) n
9 q = &p;
(gdb) n
11 r= &q;
(gdb) n
12 printf("%d", **q); /* print the value of x */
(gdb) p r
$1 = (int ***) 0x22ff40
(gdb) p *r
$2 = (int **) 0x22ff44
(gdb) p **r
$3 = (int *) 0x22ff48
(gdb) p ***r
$4 = 10
(gdb) p &r
$5 = (int ****) 0x22ff4c
(gdb) p &(&r)
Attempt to take address of value not located in memory.
(gdb) p &(*r)
$6 = (int ***) 0x22ff40
(gdb) p &(**r)
$7 = (int **) 0x22ff44
(gdb) p &(***r)
$8 = (int *) 0x22ff48
以指向int的指標而言,間隔4的跳,40,44,48,***r是值。
星星(*)不夠是址。
而&是取址的運算,
反反覆覆的看了幾次。gcc 是有規則的在做這些運算(有間距的位址計算)。
宣告時,表示
int x, *p, **q,***r;
這些都是值,而去星號的 p, q, r, 就是址,少一個也是址,只有和宣告一模一樣時,是值。
理解: 關於理解這件事,何謂理解,無法應用的話,不算理解。不把值print出來,無法理解,有些人不把值 print出來,卻能畫圖來理解,不同的理解方式,大家溝通起來都是指同一個指標嗎??
#include <stdio.h>
int main(void)
{
float *fp, **mfp, val;
fp = &val;
mfp = &fp;
**mfp = 444.903;
printf("%f %f", val, **mfp);
return 0;
}
Breakpoint 1, main () at pointer02.c:7
7 fp = &val;
(gdb) n
8 mfp = &fp;
(gdb) n
10 **mfp = 444.903;
(gdb) n
11 printf("%f %f", val, **mfp);
(gdb) p val
$1 = 444.903015
(gdb) p *val
Attempt to take contents of a non-pointer value.
(gdb) p &val
$2 = (float *) 0x22ff44
(gdb) p fp
$3 = (float *) 0x22ff44
(gdb) p *fp
$4 = 444.903015
(gdb) p **fp
Attempt to take contents of a non-pointer value.
(gdb) p ***fp
Attempt to take contents of a non-pointer value.
(gdb) p *mfp
$5 = (float *) 0x22ff44
(gdb) p mfp
$6 = (float **) 0x22ff48
(gdb) p printf("%f", *fp)
444.903015$7 = 10
(gdb) cont
Continuing.
p printf("%f", *fp),gdb 可以格式化。Attempt to take contents of a non-pointer value.,自己加星星,沒有太大的意義。
額外的問題,為什麼值從 444.903 變成 444.903015,筆者真的不知道。
幸好這不是重點。