天天看点

C语言基础---11.数组相关常见的坑(字符数组、字符指针、strcpy与=区别)

文章目录

    • 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’ })的问题。