本文共 2251 字,大约阅读时间需要 7 分钟。
学了一段时间数组、指针、地址等相关知识,感觉自己算入门了,其实发现距离入门还差18条鸿沟,还得继续努力才能入门!
数组名的指向不可以改变(指向的地址不能改变),但此地址的值,是可以改变的!
#includeint 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);}
helloabcd // 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的本质是:通过字符指针修改的内容。。在原始常量区地址修改值,而不是新建一块内存空间去初始化。(strcpy的详情如下)
以下内容,来源:
https://www.cnblogs.com/ngnetboy/archive/2012/11/19/2777384.html
char *strcpy(char *dest, const char *src)
参数:
返回值:
strcpy()的常规用法:(重点不在这边!)
#include#include #define MAX 20int main(void){ char a[MAX]="abc"; char b[MAX]="abcdefghi"; strcpy(a,b); puts(a); puts(b);}
abcdefghiabcdefghi
#include#include #define MAX 20int main(void) { char* pc = "hello"; printf("%p \n", pc); pc = "abcd"; printf("%p \n", pc); //pc[0] = 'm'; // 为什么不行,编译显示没有读写权限 //printf("%c \n", pc[0]);}
00A07D4800A07C10
- 如上pc为字符指针,指针的指向是可以改变的(指针的值可以改变),所以最终pc的值发生了改变。
- 但根据指针pc,去修改指向内存的值,是不行的!其实,char* pc = "hello"等价于:const char * pc = “hello”.说明这是一个数组指针常量,首先是个常量,其次才是数组指针,说明不能用 *指针修改指针所指向的值。
- 有关指针常量、常量指针,可以参考博文:
strcpy()的特殊用法:
#include#include #define MAX 40int 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);}
beastyou are beastbeast
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’ })的问题。