学了一段时间数组、指针、地址等相关知识,感觉自己算入门了,其实发现距离入门还差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’ })的问题。