1. 程式人生 > >指針 和二維數組

指針 和二維數組

print ima 運算 交換 name num 引用 color sign

指針

一,傳值、引用方式

//()優先級最高

Swap1 引用

  1. void swap(int *a, int *b){
  2. int temp;
  3. temp = *a;
  4. *a = *b;
  5. *b = temp;
  6. }

交換成功技術分享圖片

Swap 2 傳值

  1. void swap(int a, int b){
  2. int temp;
  3. temp = a;
  4. a = b;
  5. b = temp;
  6. }

交換失敗 技術分享圖片

二,數組與指針的不同 : sizeof(name of array) & sizeof(ptr)

size_t 的類型是unsigned long

  1. printf("\nsizeof(ptr) is %u\n", sizeof(ptr));
  2. printf("sizeof(*ptr) is %u\n", sizeof(*ptr));
  3. printf("sizeof(array) is %-ud\nsizeof(array[0]) is %-ud\n",sizeof(array),sizeof(array[0]));
  4. printf("The number of the array is %d", sizeof(array) / sizeof(array[0])); //可以用來計算數組中元素的個數

技術分享圖片

三,指針運算

  1. 指針的加減和比較:只有指向統一數組的指針進行指針算數和比較才有用 否則useless
  2. 只有相同類型的指針才可以賦值。不過void *ptr 除外 ,void *ptr 表示各個指針類型的通用指針

四,用數組或指針實現字符串的復制

  1. void copy1(char *a,const char *b) //b字符串復制到a (數組)
  2. {
  3. for
    (size_t i = 0; (a[i] = b[i]) != ‘\0‘;i++)
  4. {
  5. ;
  6. }
  7. }
  8. void copy2(char *a, const char *b)//b字符串復制到a (指針)
  9. {
  10. for (; (*a = *b) != ‘\0‘;a++,b++)
  11. {
  12. ;
  13. }
  14. }

結果:

技術分享圖片

Copy1中的a[i] = b[i] 完成了賦值,然後(a[i] = b[i]) != ‘\0‘判斷是否是字符串的末尾,i++代表數組的下標在每循環一次的時候會加一

同理 copy2中的*a = *b完成了賦值,然後(*a = *b) != ‘\0‘判斷是否是字符串的末尾 因為*a *b最初都代表的是字符串的第一個字符,所以a++,b++代表指針的移動(針對數組這樣的移動才有效)

一個小坑

copy1 copy2中都是空循環,賦值語句在判斷語句已經中完成了,並且都是 (*a = *b) != ‘\0‘

那我們把這copy2改一下,把判斷條件和賦值語句分開寫。

我們知道字符串末尾一定是有‘\0‘

  1. void copy3(char *a, const char *b)
  2. {
  3. for (; *a != ‘\0‘; a++, b++) //a最後有\0
  4. {
  5. *a = *b;
  6. }
  7. }
  8. void copy4(char *a, const char *b)
  9. {
  10. for (; *b != ‘\0‘; a++, b++) //a最後沒有\0
  11. {
  12. *a = *b;
  13. }
  14. }

結果:

技術分享圖片

所以復制字符串一定要把\0復制進去,如果沒有\0 會出現以上亂碼。

指針 和二維數組