昨晚的幣別轉換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**總是記住原先的位址。
小結:有點離題了。