陣列與指標
阿新 • • 發佈:2021-06-28
sizeof只能計算出靜態陣列的大小,無法計算動態分配或外部陣列大小。
7.請寫出以下程式碼輸出結果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
int main(void) {
printf("%d \r\n", (str1 == str2));
printf("%d \r\n", (str3 == str4));
printf("%d \r\n", (str5 == str6));
printf("%d \r\n", (str7 == str8));
system("pause");
return 0;
}
輸出結果 0 0 1 1
原因:str1, str2, str3, str4屬於陣列變數,都有各自的記憶體空間;str6, str7, str8, str9屬於指標,它們都指向了相同的常量區域。
8.以下程式碼的兩個sizeof用法有問題嗎?
static void UpperCase(char str[]) {
for(int i = 0; i < sizeof(str) /sizeof(str[0]); ++i) {
if('a' <= str[i] && str[i] <= 'z') {
str[i] -= ('a' - 'A');
}
}
}
int main() {
char str[] = "aBcDe";
printf("str 長度 = %d\r\n", sizeof(str) / sizeof(str[0]));
UpperCase(str);
printf("%s\r\n", str);
system("pause");
return 0;
}
UpperCase函式內的sizeof用法有問題。
sizeof只能計算出靜態陣列的大小,無法計算動態分配或外部陣列大小。
函式外部的str是一個靜態陣列,其大小為6;
函式內的str實際只是一個指向字串的指標,因此,其計算的是一個指標的大小:4個位元組。
9.請寫出下列程式碼的輸出結果
int main() {
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d,%d\r\n", *(a + 1), *(ptr - 1));
system("pause");
return 0;
}
輸出:2,5
原因:*(a + 1)就是a[1],*(ptr - 1)就是a[4]
&a + 1不是陣列首地址+1,系統會預設加一個數組a的偏移(這裡是偏移了一個數組的大小,本陣列大小為5個int)
int *ptr = (int *)(&a + 1);prt實際就是&(a[5]),也就是a + 5;
原因如下:
&a是陣列指標,其型別為int(*)[5];
指標加1,要根據指標的型別加上一定的值,不同型別的指標加1之後增加的大小不同。
a是長度為5的int的陣列指標,所以要加5 * sizeof(int)
所以,ptr實際是&a[5]。
但是ptr的型別與&a的型別是不同的,因此ptr – 1只會減去sizeof(int *)
a與&a的地址是一樣的,但是它們所表示的意義不同。
a是陣列首地址,也就是a[0]的地址;
&a是物件(陣列)首地址;
a+1是陣列下一個元素的地址,即a[1];
&a+1是下一個物件的地址,即a[5]。