iT邦幫忙

DAY 15
3

emacs的30天學習筆記系列 第 25

emacs 做中學第二十四天: 複習指標(*)

  • 分享至 

  • xImage
  •  

星星,滿天的星星,星星飛滿天

原版是參考: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,筆者真的不知道。
幸好這不是重點。


上一篇
emacs 做中學第二十三天:複習一些C的文法(syntax)
下一篇
emacs 做中學第二十五天:未做完的gsoap client消費別人的web service
系列文
emacs的30天學習筆記38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言