1. 程式人生 > 其它 >陣列與指標

陣列與指標

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]。