iT邦幫忙

DAY 15
1

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

emacs 做中學第二十三天:複習一些C的文法(syntax)

  • 分享至 

  • xImage
  •  

昨晚的幣別轉換web 服務,把兩個幣別設成enum(列舉),response的資料結構裏有指標。

今晚筆者自己複習一些文法。如果沒有每天用,大概又忘記了。

#include <stdio.h>

int main()
{
  enum weekday{
    sun,mon,tue,wen,thu
    ,fri,sat
  } a,b,c;
  a=sun;
  b=tue;
  c=sat;

  printf("%d,%d,%d\n", a,b,c);
  return (0);
}

程式來源:http://zhidao.baidu.com/question/93310534

$ ./enum_day
0,2,6

體現了,enum,就是 0,1,2,3,4...

所以,USD, TWD, ...國別碼,就是0,1,2,...

這個範例讓筆者了解塞值(assign value)的方式。

指標呢?這些星星,總是搞得筆者多年來,記了又忘,忘了又記。

emacs和vim的好處,就是可以分割畫面,Ctrl-x 0, 1, 2, 3, 4, 多按幾次,感覺就來了。沒有正式規定怎麼切割劃面,自己爽為主。

#include <stdio.h>
#include <string.h>

int main(void)
{
  char str1[] = "Pointers are fun and hard to use";
  char str2[80], *p1, *p2;

  /* make p point to end of str1 */
  p1 = str1 + strlen(str1) - 1;

  p2 = str2;

  while(p1 >= str1)
    *p2++ = *p1--;

  /* null terminate str2 */
  *p2 = '\0';

  printf("%s %s", str1, str2);

  return 0;
}

這個範例,用gdb trace 可以感受一下變數的3個面向。

14        while(p1 >= str1)
(gdb) p p1
$1 = 0xbffff2f9 "se"
(gdb) p *p1
$2 = 115 's'
(gdb) p &p1
$3 = (char **) 0xbffff284
(gdb) n
15          *p2++ = *p1--;
(gdb) n
14        while(p1 >= str1)
(gdb) n
15          *p2++ = *p1--;
(gdb) n
14        while(p1 >= str1)
(gdb) p p1
$4 = 0xbffff2f7 " use"
(gdb) p *p1
$5 = 32 ' '
(gdb) p &p1
$6 = (char **) 0xbffff284
(gdb) n
15          *p2++ = *p1--;
(gdb) n
14        while(p1 >= str1)
(gdb) n
15          *p2++ = *p1--;
(gdb) n
14        while(p1 >= str1)
(gdb) n
15          *p2++ = *p1--;
(gdb) p p1
$7 = 0xbffff2f5 "to use"
(gdb) p *p1
$8 = 116 't'
(gdb) p &p1
$9 = (char **) 0xbffff284

print p1, *p1, &p1, 這是把一串字,翻轉印一次。
效果如下:

$ ./str_invr
Pointers are fun and hard to use esu ot drah dna nuf era sretnioP

p1 是指漸漸變長的字串,*p1 指單一字元。&p1是原來的位址,一直不變。

*p2++ = *p1--;

最難理解的是這段,短短一行,卻含了幾個動作,
索引值,可以運算,位址是數字可以運算,一次**--++**一個索引值,然後
再塞值(assign value)。

而**&p1**總是記住原先的位址。

小結:有點離題了。


上一篇
emacs 做中學第二十三天:加重編輯code
下一篇
emacs 做中學第二十四天: 複習指標(*)
系列文
emacs的30天學習筆記38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言