指針 和二維數組
阿新 • • 發佈:2018-01-01
print ima 運算 交換 name num 引用 color sign
指針
一,傳值、引用方式
//()優先級最高
Swap1 引用
- void swap(int *a, int *b){
- int temp;
- temp = *a;
- *a = *b;
- *b = temp;
- }
交換成功
Swap 2 傳值
- void swap(int a, int b){
- int temp;
- temp = a;
- a = b;
- b = temp;
- }
交換失敗
二,數組與指針的不同 : sizeof(name of array) & sizeof(ptr)
size_t 的類型是unsigned long
- printf("\nsizeof(ptr) is %u\n", sizeof(ptr));
- printf("sizeof(*ptr) is %u\n", sizeof(*ptr));
- printf("sizeof(array) is %-ud\nsizeof(array[0]) is %-ud\n",sizeof(array),sizeof(array[0]));
- printf("The number of the array is %d", sizeof(array) / sizeof(array[0])); //可以用來計算數組中元素的個數
三,指針運算
- 指針的加減和比較:只有指向統一數組的指針進行指針算數和比較才有用 否則useless
- 只有相同類型的指針才可以賦值。不過void *ptr 除外 ,void *ptr 表示各個指針類型的通用指針
四,用數組或指針實現字符串的復制
- void copy1(char *a,const char *b) //將b字符串復制到a中 (數組)
- {
- for
- {
- ;
- }
- }
- void copy2(char *a, const char *b)//將b字符串復制到a中 (指針)
- {
- for (; (*a = *b) != ‘\0‘;a++,b++)
- {
- ;
- }
- }
結果:
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‘的
- void copy3(char *a, const char *b)
- {
- for (; *a != ‘\0‘; a++, b++) //a最後有\0
- {
- *a = *b;
- }
- }
- void copy4(char *a, const char *b)
- {
- for (; *b != ‘\0‘; a++, b++) //a最後沒有\0
- {
- *a = *b;
- }
- }
結果:
所以復制字符串一定要把\0復制進去,如果沒有\0 會出現以上亂碼。
指針 和二維數組