• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C语言字符串常量、字符数组、字符指针

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近被这几个概念搞的头晕目眩,貌似懂了,但没完全懂。想通过理解的方式去搞清楚,而不是通过记性来记住。发现了一句万能钥匙,能解决大部分跟指针相关的概念问题:

指针存储的是地址。

 

1、代码

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello C-Free!\n");
    
    //定义一个数组变量,用字符串常量初始化其值 。 
    char a[] = "123";          
    //定义一个字符指针,再定义一个字符串常量,指针指向的常量首地址 
    const char* b = "321";    
    const char* c = "321";    
    //打印变量在内存里的地址,栈区【高地址->低地址】 
    printf("%d,%d,%d\n",&a, &b, &c);//6356772,6356768,6356764
    //打印指针的首地址,b和c相同因为都指向同一常量区 
    printf("%d,%d,%d\n",a, b, c);    //6356772,4206607,4206607
    //打印内容 
    printf("%s,%s,%s\n",a, b, c);    //123,321,321

    //从b内存拷贝3个字节给a变量,正常 
    memcpy(a, b, 3); 
    //从a内存拷贝3个字节给a常量指针,编译失败或运行失败,常量不可修改 
    memcpy(b, a, 3); 

    printf("%s,%s,%s\n",a, b, c);    //123,321,321
    return 0;
}

2、字符串常量

定义:用双引号(“”)括起来的0个或者多个字符组成的序列
存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志
 
字符串常量在内存的常量存储区是按顺序存储的,如:
char* a = "123";
char* b = "456";
char* c = "456";

 

 

 定义a时,存储一个“123\0”;

 定义b时,判断存储区是否有"456\0",发现没有则在后面追加"456\0";

 定义c时,判断存储区是否有"456\0",发现有,则不再存储,此时b和c两个指针存储的都是"456\0"这片内存地址

既然是常量,那么不可被修改,所以memcpy(b, a, 3);是错误的

 

 

3、字符数组

char a[] = "123";

首先声明一个字符数组a,大小没有确定,但是将一个字符串常量“123\0”赋值给了a,故a的length就是4个字节。【注意“123\0”并没有存储在常量区】

注意a归根结底是一个数组,数组是一个变量,不是指针,虽然可把a当做一个指针,因为它指向数组的首地址,但归根结底不是指针,指针存的是地址,变量存的是指...又晕了

正因为a是变量,所以a能够修改其存储的值。

a[0] = \'a\';

 

4、字符指针

const char* b = "321";

既然名字是字符指针,那么它一定是个指针,根据万能钥匙能够得知,指针存储的地址。

故解读这句就是:

首先声明一个字符指针b,然后定义一个字符串常量"321\0",字符串常量存储在常量区,b存储在栈区,b存储的值是字符串常量"321\0"的地址。

这里用到了const,在C语言里不加const也行,C++里不加会有个警告,但不影响编译。但是建议加上const,能够让程序员一眼就知道此指针指向的是常量,也就是最终内容无法修改。

ps:

const type* p;

虽然最终指向不能修改,但是指针自身的取值,是可以修改的,即可修改指针指向的地方。

 

 

 

 

5、内存图

 

 

ps:所有存储类型代码区、常量区、静态区(全局区)、堆区、栈区,只有栈是从高地址往低地址存储,其他都是低地址往高地址存储。

根据这个,打印一个栈变量地址是0x7******,大概能够猜到此pc的内存条大小为8GB【纯猜测未验证】

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
2018上C语言程序设计(高级)作业-第0次作业发布时间:2022-07-13
下一篇:
c#接口和抽象类的区别发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap