Like Share Discussion Bookmark Smile

J.J. Huang   2019-10-26   C C 語言技術 <201910>   瀏覽次數:次   DMCA.com Protection Status

C語言 - 第二十二章 | 指標 - 指標與字串

字元指標可以參考至一個字串常數,這使得字串的指定相當的方便,例如下面的程式片段宣告一個字串指標,並指向一個字串常數。

1
char *str = "hello";

使用字元指標的好處是,你可以直接使用指定運算子將一個字串常數指定給字元指標。

1
str = "world";
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {

char *str = "hello";
puts(str);

str = "world";
puts(str);

return 0;
}

在程式中使用一個字串常數時,該字串常數會佔有一個記憶體空間,例如"hello""world"都各佔有一塊記憶體空間,所以上面的程式str前後指向的記憶體位址並不相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main() {

char *str = "hello";
void *add = str;

printf("%s\t%p\n", str, add);

str = "world";
add = str;
printf("%s\t%p\n", str, add);

return 0;
}

如上面的程式所示,"hello"字串常數的位址是在01297B30,而"world"字串常數的位址是在01297BDC,兩個的位址並不相同。

要注意的是,如果使用陣列的方式宣告字串,則不可以直接使用=指定運算子另外指定字串,例如下面的程式是錯誤的示範:

1
2
char str[] = "hello";
str = "world"; // error, incompatible types in assignment

在字元指標中使用指標陣列,可以更方便地處理字串陣列。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {

char *str[] = {"professor", "teacher", "student", "etc."};

for(int i = 0; i < 4; i++) {
puts(str[i]);
}

return 0;
}


str中的每個元素都是字元指標,也各自指向一個字串常數,進一步擴充這個觀念,就可以使用二維以上的字串陣列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main() {

char *str[][2] = {
"professor", "Justin",
"teacher", "Momor",
"student", "Caterpillar"
};

for(int i = 0; i < 3; i++) {
printf("%s: %s\n", str[i][0], str[i][1]);
}

return 0;
}


額外補充一點,下面兩個宣告的作用雖然類似,但其實意義不同。

1
2
char *str1[] = {"professor", "Justin", "etc."}; 
char str2[3][10] = {"professor", "Justin", "etc."};

第一個宣告是使用指標陣列,每一個指標元素指向一個字串常數,只要另外指定字串常數給某個指標,該指標指向的記憶體位址就不同了,而第二個宣告則是配置連續的3x10的字元陣列空間,字串是直接儲存在這個空間,每個字串的位址是固定的,而使用的空間也是固定的(也就是含空字元會是10個字元)。


註:以上參考了
指標與字串