學了一段時間數組、指針、地址等相關知識,感覺自己算入門了,其實發現距離入門還差18條鴻溝,還得繼續努力才能入門!
1.數組名的指向不可改變
數組名的指向不可以改變(指向的地址不能改變),但此地址的值,是可以改變的!
#include <stdio.h>
int main() {
char ps[6] = { 'h', 'e', 'l', 'l', 'o' }; // 等價於:char ps[6] = "hello";
//ps = "abcd"; // ??爲什麼不行呢?
strcpy(ps, "abcd"); // 爲什麼可以呢?
printf("%c", ps[1]);
}
- 因爲數組在初始化的時候,就確定了指向具體內存的地址,數組名 & 內存地址都深度綁定的,不能再修改了!
- 雖然地址不能修改,但是地址內的值是可以修改的,上述代碼中,ps[0] = ‘m’,(單引號,代表裏面是字符)類似這樣是可以的。
- ps = “abcd”,這個是不行的。因爲char ps[6] = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ };裏面,{ ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ }存儲在了常量內存中,而ps存儲在棧內存中,初始化的時候就深度綁定了,無法再修改內存指向。而ps = “abcd"相當於在常量內存中,再找個空間存儲"abcd”,然後讓ps指向這塊內存,所以最終無法編譯通過。
- strcpy(ps, “abcd”),這個之所以可以,是因爲strcpy的本質是:通過字符指針修改的內容。C—爲什麼不能向函數傳遞一個數組。在原始常量區地址修改值,而不是新建一塊內存空間去初始化。(strcpy的詳情如下)
2.strcpy的使用詳情:
以下內容,來源:
https://www.cnblogs.com/ngnetboy/archive/2012/11/19/2777384.html
char *strcpy(char *dest, const char *src)
參數:
- dest – 指向用於存儲複製內容的目標數組
- src – 要複製的字符串,要麼是字符指針常量、要麼是數組常量
返回值:
- 該函數返回一個指向最終的目標字符串 dest 的指針。
strcpy()的常規用法:(重點不在這邊!)
#include<stdio.h>
#include<string.h>
#define MAX 20
int main(void)
{
char a[MAX]="abc";
char b[MAX]="abcdefghi";
strcpy(a,b);
puts(a);
puts(b);
}
abcdefghi
abcdefghi
3.字符指針與strcpy的特殊用法:
#include <stdio.h>
#include <string.h>
#define MAX 20
int main(void) {
char* pc = "hello";
printf("%p \n", pc);
pc = "abcd";
printf("%p \n", pc);
//pc[0] = 'm'; // 爲什麼不行,編譯顯示沒有讀寫權限
//printf("%c \n", pc[0]);
}
00A07D48
00A07C10
- 如上pc爲字符指針,指針的指向是可以改變的(指針的值可以改變),所以最終pc的值發生了改變。
- 但根據指針pc,去修改指向內存的值,是不行的!其實,char* pc = "hello"等價於:const char * pc = “hello”.說明這是一個數組指針常量,首先是個常量,其次纔是數組指針,說明不能用 *指針修改指針所指向的值。
- 有關指針常量、常量指針,可以參考博文:
strcpy()的特殊用法:
#include <stdio.h>
#include <string.h>
#define MAX 40
int main(void) {
char* a = "beast";
char b[MAX] = "you are the beast one.";
char* p;
p = strcpy(b + 8, a); // a是字符指針常量,a
puts(a);
puts(b);
puts(p);
}
beast
you are beast
beast
strcpy函數的功能:
- 將一個字符串複製到另一個字符串。這個代碼無疑是把字符串a複製到b的第八個位置之後
- 字符串最後一個字節存放的是一個空字符——“\0”,用來表示字符串的結束。把a複製到b之後會令a的空字符把複製後的字符串隔斷,所以會顯示到beast就會結束。
- p指針爲什麼顯示爲beast?因爲strcpy函數最終返回的是b+8這個地址的指針,指針目前指向b+8這個位置,且b+8之後的內容都被a覆蓋了,所以b+8這個地方,只保留beast內容了!
- strcpy是通過常量的指針,或常量本身,或數組名、可以改變某個指針所指向的值!
- = 是直接對某個變量改變值。但是容易遇到指針常量(*p = “alien”)或數組名修改指向(char ps[6] = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ })的問題。