c語言--關於陣列與指標的一些基本運算
阿新 • • 發佈:2019-01-09
一.sizeof()的有關運算
1.知識:- 當陣列名a單獨放在sizeof()內部(即 sizeof(a))時,a表示整個陣列;當陣列名a單獨放在&後面時(即&a),a表示整個陣列;
- 其餘的a都表示陣列a首元素的地址;&a,表示陣列a的地址,其實是a首元素的地址,一個整形大小為4個位元組,一個字元型大小為1個位元組
include<stdio.h> int main() { int a[] = {1,2,3,4}; printf("%d\n",sizeof(a)); //整個陣列的大小 16 printf("%d\n",sizeof(a+0)); //首元素的地址加0,還是首元素的地址 4 printf("%d\n",sizeof(*a)); //陣列a首元素的大小 4 printf("%d\n",sizeof(a+1)); //陣列a首元素的地址加1,表示陣列第二個元素的地址的大小,地址為4個位元組 4 printf("%d\n",sizeof(a[1])); //陣列a第二個元素的大小 4 printf("%d\n",sizeof(&a)); //陣列a首元素地址的大小 4 printf("%d\n",sizeof(&a+1)); //陣列a下一個陣列(其他)的地址大小 4 printf("%d\n",sizeof(&a[0])); //陣列a首元素地址的大小 4 printf("%d\n",sizeof(&a[0]+1)); //陣列a第二個元素的地址的大小 4 return 0; } //字元陣列 #include<stdio.h> int main() { char arr[] = {'a','b','c','d','e','f'}; //arr[]表示一個字元陣列,裡面有6個元素,不包括\0,一個char型別大小為1個位元組 printf("%d\n", sizeof(arr)); //整個陣列的大小 結果為6 printf("%d\n", sizeof(arr+0)); //陣列首元素的地址 4 printf("%d\n", sizeof(*arr)); //陣列首元素的大小 1 printf("%d\n", sizeof(arr[1])); //陣列第二個元素'b' 的大小 1 printf("%d\n", sizeof(&arr)); //陣列首元素的地址 4 printf("%d\n", sizeof(&arr+1)); //跳過整個陣列,後面內容的地址的大小 4 printf("%d\n", sizeof(&arr[0]+1)); //陣列第二個元素的地址的大小 4 return 0; }
二.strlen()的有關運算
1.strlen()用來計算指定字串的長度,不包括結束字元“\0”;它會從首地址一直找下去,直到遇到"\0"停止。2.相關計算:#include<stdio.h> #include<string.h> int main() { char arr[] = {'a','b','c','d','e','f'}; printf("%d\n", strlen(arr)); //從陣列的首元素地址一直找下去,直到"\0"停止,該陣列不包括"\0",所以它會一直找下去,計算結果為一隨機數 printf("%d\n", strlen(arr+0)); //從陣列的首元素地址一直找下去,計算結果為一隨機數 printf("%d\n", strlen(*arr)); //*arr表示首元素,即'a',也就是從地址值為97開始找,但97是一個未知地址,不允許訪問,所以這題是錯誤的 printf("%d\n", strlen(arr[1])); //arr[1],即'b',所以這題也是錯誤的 printf("%d\n", strlen(&arr)); //從陣列的首地址一直找下去,計算結果為一隨機數 printf("%d\n", strlen(&arr+1)); //從跳過這個陣列的地址開始找下去,計算結果為一隨機數,比上式大6 printf("%d\n", strlen(&arr[0]+1)); //從陣列的第二個元素的地址一直找下去,計算結果為一隨機數,比上式小5 return 0; } 2. #include<stdio.h> #include<string.h> int main() { char *p = "abcdef";//*p 表示字元型別的指標變數p printf("%d\n", sizeof(p));//p存放首元素a的地址,則結果為4 printf("%d\n", sizeof(p+1));//p+1存放b的地址,結果為4 printf("%d\n", sizeof(*p));//*p表示首元素,結果為1 printf("%d\n", sizeof(p[0]));//表示首元素,結果為1 printf("%d\n", sizeof(&p));//字元型別的指標變數p的地址大小,結果為4 printf("%d\n", sizeof(&p+1));//指向下一個地址,仍然是地址,結果為4 printf("%d\n", sizeof(&p[0]+1));//b的地址,結果為4 printf("%d\n", strlen(p));//從a的地址一直找,直到遇到"\0"結束,結果為6 printf("%d\n", strlen(p+1));//從b的地址一直找,直到遇到"\0"結束,結果為6 printf("%d\n", strlen(*p));//錯誤,*p表示首元素,即'a',也就是從地址值為97開始找,但97是一個未知地址,不允許訪問,所以這題是錯誤的 printf("%d\n", strlen(p[0]));//錯誤,與上式一樣 return 0; }