2013年2月26日 星期二

[C 常見考題] Pointer Quiz - Part1


Quiz:
請試著寫出下面代碼的輸出:
  1. #include   
  2. #include   
  3.   
  4. int main()  
  5. {  
  6.   char strAry[] = "This is string";  
  7.   char *aryPtr = strAry;  
  8.   int *intPtr = (int*)strAry;  
  9.   printf("\t[Line01] strAry=%s\n", strAry);  
  10.   printf("\t[Line02] aryPtr=%s\n", aryPtr);  
  11.   //printf("\t[LineX] *aryPtr=%s\n", *aryPtr); // Segment fault  
  12.   printf("\t[Line03] sizeof(aryPtr)=%d\n", sizeof(aryPtr));  
  13.   printf("\t[Line04] sizeof(*aryPtr)=%d\n", sizeof(*aryPtr));  
  14.   printf("\t[Line05] *aryPtr='%c'\n", *aryPtr);  
  15.   printf("\t[Line06] *aryPtr+1='%c'\n", *aryPtr+1);  
  16.   printf("\t[Line07] *(aryPtr+1)='%c'\n", *(aryPtr+1));  
  17.   printf("\t[Line08] sizeof(intPtr)=%d\n", sizeof(intPtr));  
  18.   printf("\t[Line09] sizeof(*intPtr)=%d\n", sizeof(*intPtr));  
  19.   printf("\t[Line10] intPtr=%s\n", intPtr);  
  20.   //printf("\t[LineX] *intPtr=%s\n", *intPtr); // Segment fault  
  21.   printf("\t[Line11] *intPtr='%c'\n", *intPtr);  
  22.   printf("\t[Line12] *intPtr+1='%c'\n", *intPtr+1);  
  23.   printf("\t[Line13] *(intPtr+1)='%c'\n", *(intPtr+1));  
  24.   return 0;  
  25. }  
Sol:
[Line01] strAry=This is string # 字串陣列 char[] ="..." 會自動加上 NULL 到結尾.
[Line02] aryPtr=This is string # 同上, 只是把 aryPtr 指標指向 strAry 的位置. strAry 本身也是個指標.
[Line03] sizeof(aryPtr)=4 # 指標的大小根據系統是 32bit (4byte) 或是 64bit(8bypte) 有所不同.
[Line04] sizeof(*aryPtr)=1 # char 的大小為 1 byte.
[Line05] *aryPtr='T' # 指向字串中第一個字元 'T'
[Line06] *aryPtr+1='U' # char 'T' + 1=char 'U'. -> ASCII 'T'=84. 84+1=85=ASCII 'U'.
[Line07] *(aryPtr+1)='h' # 將 aryPtr 指標移動一個 char 的位置 (1 個 byte 的距離), 即是字串的第二個字元 'h'.
[Line08] sizeof(intPtr)=4 # 同 Line03
[Line09] sizeof(*intPtr)=4 # int 類型的大小為 4 byte.
[Line10] intPtr=This is string # 雖然用 int* 指定 pointer 類型, 但是在 printf 使用 '%s', 故還是打印出字串出來.
[Line11] *intPtr='T' # 指向字串中第一個字元 'T'.
[Line12] *intPtr+1='U' # 同 Line6
[Line13] *(intPtr+1)=' ' # 因為 指標類型為 int, 故移動一個位置為 4 byte, 所以指向第 0+4 =4 位置上的字元, 即字串的第五個字元 (從 0 開始).
This message was edited 4 times. Last update was at 26/02/2013 18:29:39

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...