C语言基础---11.数组相关常见的坑(字符数组、字符指针、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’ })的问题。
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello-alien

您的鼓励,是我最大的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值