[ ] 和 * 的区别
#include <stdio.h> #include <string.h> //数组 int a[10] //字符串 // 1 C语言的字符串 是以零结尾的字符串 // 2 在C语言中没有字符串类型 通过字符数组 来模拟字符串 // 3 字符串的内存分配 堆上 栈上 全局区(很重要) // 字符数组 初始化 int main1(void) { //1 指定长度 char buf2[100] = {'a','b','c','d'}; //1 -1 char buf3[2] = {'a','b','c','d'};//如果初始化的个数大于内存的个数 编译错误 初始化项太多 //1 -2 //后面的buf2[4]-buf2[99]都为0 //2 不指定长度 C编译器会自动帮程序员 求元素的个数 char buf1[] = {'a','b','c','d'}; //buf1是一个数组 不是一个以0结尾的字符串 return 0; } //用字符串 来 初始化字符数组 //strlen() 长度不包括 0 //sizeof() 内存块的大小 int main2(void) { int size = 0; char buf3[] = "abcd"; //buf3 作为字符数组 应该是5个字节 //作为字符串 应该是4个字节 int len = strlen(buf3); printf("buf3字符的长度:%d\n", len); //4 //buf3 作为数组 数组是一种数据类型 本质(固定大小内存块的别名) size = sizeof(buf3); printf("buf3数组所占内存空间大小:%d\n", size); //5 { char buf4[128] = "abcd"; printf("buf4[100]:%d \n", buf4[100]); len = strlen(buf4); printf("buf4字符的长度:%d\n", len); //4 size = sizeof(buf4); printf("buf4数组所占内存空间大小:%d\n", size); //128 } return 0; } //通过数组下标 和指针 int main(void) { int i = 0; char *p = NULL; char buf5[128] = "abcdefg"; //临时区分配的内存,程序运行完就释放内存,故buf5不能修改 for(i = 0; i < strlen(buf5); i++) { printf("%c ", buf5[i]); } p = buf5; //buf5 代表数组首元素的地址 for(i = 0; i < strlen(buf5); i++) { //printf("%c ", *(p+i)); printf("%c ", *(buf5+i)); } /*[] *的推导过程 buf5[i] ====> buf5[0+i]; =====>buf5(0+i); ===>*(buf5+i); */ { //buf5 = buf5 +1; //error C2106: “=”: 左操作数必须为左值 //buf5 = 0x11; //error C2106: “=”: 左操作数必须为左值 } return 0; } //[]的本质 和 *P 是一样的, 只不过是符合程序员的阅读习惯 //buf5 是一个指针 , 只读的常量 buf5是一个常量指针 析构内存时,保证buf所指向的内存空间安全释放
[]的本质 和 *P 是一样的, 只不过是符合程序员的阅读习惯
buf5 是一个指针 , 只读的常量 buf5是一个常量指针 析构内存时,保证buf所指向的内存空间安全释放
char *buf = "abcdefg"; //全局区分配内存
char buf5[128] = "abcdefg"; //临时区分配的内存,程序运行完就释放内存,
故buf所指向的内存空间安全释放,buf5即内存首地址不能修改
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
|
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |

浙公网安备 33010602011771号