博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言基础---11.数组相关常见的坑(字符数组、字符指针、strcpy与=区别)
阅读量:2393 次
发布时间:2019-05-10

本文共 2251 字,大约阅读时间需要 7 分钟。

文章目录

学了一段时间数组、指针、地址等相关知识,感觉自己算入门了,其实发现距离入门还差18条鸿沟,还得继续努力才能入门!

1.数组名的指向不可改变

数组名的指向不可以改变(指向的地址不能改变),但此地址的值,是可以改变的!

#include 
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);}
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的详情如下)

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
#include
#define MAX 20int main(void){
char a[MAX]="abc"; char b[MAX]="abcdefghi"; strcpy(a,b); puts(a); puts(b);}
abcdefghiabcdefghi

3.字符指针与strcpy的特殊用法:

#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’ })的问题。
你可能感兴趣的文章
Spring中注解的使用
查看>>
Spring的认识
查看>>
gitee的使用
查看>>
maven项目出现如下错误,求指点;CoreException: Could not calculate build plan:
查看>>
理解Paxos算法的证明过程
查看>>
详解 JVM Garbage First(G1) 垃圾收集器
查看>>
Java 8 函数式编程入门之Lambda
查看>>
用高阶函数轻松实现Java对象的深度遍历
查看>>
WindowsApi+Easyx图形库的透明时钟
查看>>
Eclipse LUNA配置TomCat(非j2ee版本)
查看>>
树莓派安装mysql-srver报错 404 not found!
查看>>
Ubuntu 14.04LTS 下安装.net框架
查看>>
Eclipse 配置Groovy语言环境 && Java工程运行Groovy
查看>>
人工智能术语表
查看>>
Tensorflow Python API 翻译(sparse_ops)
查看>>
Tensorflow Python API 翻译(math_ops)(第一部分)
查看>>
Tensorflow Python API 翻译(math_ops)(第二部分)
查看>>
Tensorflow Python API 翻译(array_ops)
查看>>
Tensorflow Python API 翻译(constant_op)
查看>>
金融套利策略:理解统计套利的工作原理
查看>>