文章目錄
-
- 1.數組名的指向不可改變
- 2.strcpy的使用詳情:
- 3.字元指針與strcpy的特殊用法:
學了一段時間數組、指針、位址等相關知識,感覺自己算入門了,其實發現距離入門還差18條鴻溝,還得繼續努力才能入門!
1.數組名的指向不可改變
數組名的指向不可以改變(指向的位址不能改變),但此位址的值,是可以改變的!
#include <stdio.h>
int main() {
char ps[6] = { 'h', 'e', 'l', 'l', 'o' }; // 等價于:char ps[6] = "hello";
printf("%s \n", ps);
strcpy(ps, "abcd");
//ps = "abcd"; // 為什麼不行呢?
printf("%s", ps);
}
hello
abcd // ps的值為什麼又變為了abcd了?
- 因為數組在初始化的時候,就确定了指向具體記憶體的位址,數組名 & 記憶體位址都深度綁定的,不能再修改了!
- 雖然位址不能修改,但是位址内的值是可以修改的,上述代碼中,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”.說明這是一個數組指針常量,首先是個常量,其次才是數組指針,說明不能用 *指針修改指針所指向的值。
有關指針常量、常量指針,可以參考博文:
C—const、指針、數組、指針常量,常量指針等歸納總結
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’ })的問題。