目录
一.数组和指针
1.字符串数组和字符数组区别
2.数组存储字符串常量
3.指针存储字符串
二.数组和指针的区别
1.常量和变量
2.修改成本
3.存储成本
一.数组和指针
1.字符串数组和字符数组区别
char ch[]="hello world",末尾存储着\0,就是字符串,相当于Char ch[]={'h','e','l','l','o',' ','w','o','r','l','d','\0'}
Char ch[]={'h','e','l','l','o',' ','w','o','r','l','d'},字符数组(末尾并没有存储\0)
这里的\0属于char形式的空字符,不是数字字符0
字符数组因为没有'\0',所以系统在打印的时候是无法检测到结束的,啥时候能结束全靠啥时候能遇到一个'\0';
演示代码:
#include <stdio.h>
#define CHAR "hello world"
int main()
{
char ch_o[] = { 'h','e','l','l','o' };
char ch_t[] = "hello";
printf("字符数组: %s\n字符串数组: %s\n", ch_o, ch_t);
return 0;
}
这里可以看出来字符数组打印中会出现一段乱码部分。该演示代码,具体效果不固定,但基本原理一致。
2.数组存储字符串常量
数组形式,Char ch[]="hello world",ch在计算机的内存中分别为了一个内含12个元素的数组(每个元素对应一个字符,还加上一个末尾的空字符‘\0’),每个元素被初始化为字符串字面量对应的字符。
通常,字符串都作为可执行文件的一部分存储在数据段中。当把程序载入内存时,也载入了程序中的字符串。
字符串存储在静态存储区中,但是,程序在开始运行时才会为该数组分配内存,然后猜把字符串拷贝到数组中。注意此时字符串有两个副本。一个时在静态内存中的字符串字面量,另一个时存储在ch数组中的字符串。
演示代码:
#include <stdio.h>
#define CHAR "hello world"
int main()
{
char ch[] = CHAR;
printf("CHAR 地址: %p\n\"hello world\"地址: %p\nch 地址: %p\n", CHAR,"hello world", ch);
return 0;
}
明示常量CHAR,“hello world”和字符串数组的内容都是一样,但首元素地址是完全不同的,这也说明了ch存储的是"hello world"的副本。
3.指针存储字符串
指针形式,Char * ch = "hello world"也时得编译器为字符串在静态存储区预留12个元素得数组。另外,一旦开始执行程序,它会为指针变量ch留出一个存储位置,并把字符串得地址存储在指针变量中。该变量最初指向该字符串得首字符。
#include <stdio.h>
#define CHAR "hello world"
int main()
{
char* p = CHAR;
printf("CHAR 地址: %p\np存储的地址: %p\nhello world字符串地址: %p", CHAR, p,"hello world");
return 0;
}
明示常量CHAR,“hello world”和指针P的内容都是一样,同时三者的首元素地址也都是相同的。
二.数组和指针的区别
1.常量和变量
Char ch1[]="hello world"
Char * ch2 = "hello world"
首先我们要理清一个逻辑,数组名就是首元素的地址,这就意味着数组名是一个常量,如果我们对这个常量进行的更改,那么我们将无法在访问到这个字符串副本了。而指针属于变量,对于对于变量,指针所指向的地址是可以改变的
#include <stdio.h>
#define CHAR "hello world"
int main()
{
char ch[] = CHAR;
char* p = CHAR;
printf("ch首元素地址: %p 字符串值: %s\np首元素地址: %p 字符串值: %s\n", ch, ch, p, p);
p++;
ch++;
}
这里其实我想演示下,但编译器已经报警,不让这样操作。
2.修改成本
因为指针指向字符串存储位置,所以该变一处就会直接影响字符串内容,所以一般推荐用
const Char * ch2 = "hello world" 保证字符串内容不会被改变
但数组因为存储的字符串副本,所以可以随意更改
这里其实我想修改指针,但编译器已经报警,不让这样操作。
所以这里我演示修改了数组ch,可以发现程序没有报警。
3.存储成本
因为数组存储的是副本,这就意味着它所需要的存储空间是个完整的字符串大小。但指针因为只存储字符串的首元素地址,所以它一般只占用8个字节(或4个字节)
#include <stdio.h>
#define CHAR "hello world"
int main()
{
char ch[] = CHAR;
char* p = CHAR;
printf("ch字符串: %s ch大小: %zd\n指针p字符串: %s p大小: %zd\n\
明示变量CHAR字符串: %s CHAR大小: %zd\n", ch,sizeof(ch), p,sizeof(p), CHAR,sizeof(CHAR));
return 0;
}
所以根据上面三个区别,如果想要修改字符串内容,用数组。如果想要降低存储大小,就用指针
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈