C语言字符串
字符串常量与字符数组的区别
1)字符串常量是一个字符数组,但是内容和长度在初始化时就已经固定了,不可更改;可以通过一个指向字符串常量第一个元素的指针来访问该字符串常量;
2)字符数组是一个用于存放字符的数组,字符数组的值是可以更改的。
#include <stdio.h>
int main(int argc, char *argv[])
{
char *str = "Hello World"; // char *
char s[] = "Hello C 语言"; // char var[]
printf("%s\n", str);
printf("%s\n", s);
// str[2] = 'D'; // char* 不可以改变其中单个字符
s[2] = 'D'; // char[] 可以改变其中单个字符
str = "Hello String"; // char* 可以改变整个字符串
printf("%s\n", str);
printf("%s\n", s);
}
数组不是指针,指针也不是数组,这是两个不同的东西,只是在某些场合下,可以进行相似的操作。
char a[10] = "Hello";
char *p = "World";
a和p在内存分别是这样的(手一抖,多了个w)
可以看出,p是一个指针,其内容指向一个数组;a就是数组本身;再看操作上的不同1、对于sizeof操作符来说,char p结果是指针大小,我的机器是8,char p[10]结果是数组大小,是10。2、对&(取地址)操作符而言,得到的结果不一样,a = &a = &a[0],这三个数值都一样,但是类型不一样,&a是数组指针char ()[10],&a[0]是指向第一个元素的指针,是char ; p != &p,p最为一个变量,本身需要内存存放,这个地址是p本身,&p获取p本身的地址,类型是char **,p存放的值为指向的数组首址,所以p != &p
void func(char (p)[10]);
func(&p); // error
func(&a); // ok
3)、编译器对两者的处理不同,即访问a和p(不是内容),产生的汇编不同,具体后补为什么会说指针和数组一样呢,这是因为在指针代数运算、数组下标运算和数组作为参数传递给函数的时候,数组会退化生成指向第一个元素的指针。p[2] => *(p + 2), a[2] => *(a + 2),在这里看起来是等价的,而且还有诡异的写法3[p], 4[a]都是合法表达式,因为都会被转换成指针运算。
当参数时是一样的,[]在传参时被编译器隐式转换为*
sizeof时和取地址&时完全不一样(好像是废话...)
直接初始化时,在作用域内分配空间时也不太一样,char*的会被扔到常量区,只在栈上分个指针;而[]的是直接栈上分配,出了作用域就自动销毁
Char※ 是一个指针 指向的是一个字符类型 char「」是一个字符数组 存储的是一个字符类型的数组 c中字符串常量就是一个指向字符类型的指针 而字符串变量一般存储在字符数组里