char* a 和 char b[]:相同、不同
char* a 和 char b[]:相同、不同
1、都可以直接记录字符串
#include<stdio.h>
void main(){
//直接定义并赋为字符串
char * a="string1";
char b[]="string2";
//其中,用%s输出单个字符 报错
//printf("%s",a[0]);
//printf("%s",b[0]);
//用c就ok
printf("a=%c\n",a[0]);
printf("b=%c\n",b[0]);
printf("a=%s, b=%s", a, b);
}
2、函数传参数时,二者可以混用
两种形参写法完全等效
//定义一个函数,将数组b传入
void fun1(char b[])
{
printf("%s", b);
}
int main()
{
//定义char *a ,并将 a 作为形参传入
char *a = "Hello World";
fun1(a);
}
Hello World
不同点
a是一个指针变量,a的值(指向)是可以改变的,但a只能指向(字符串)常量,指向的区域的内容不可改变;
b是一个指针常量,b的值(指向)不能变;但b指向的目标的内容是可变的,就是对应的数组的值可变。
以下使其相互赋值,以验证。
1、
#include<stdio.h>
int main()
{
char * a="string1";
char b[]="string2";
// 令a = b; a的内容是可变的。
printf("%s\n",a);
a = b;
printf("%s\n",a);
}
string1
string2
2、
#include<stdio.h>
int main()
{
char * a="string1";
char b[]="string2";
printf("%s\n",b);
//令 b = a,无法成功,因为b声明的是数组
b = a;
printf("%s\n",b);
}
assignment to expression with array type 把数组拿去赋值了 不行的
char*是变量,值可以改变,数组 char[]是常量,值不能改变。
解释:
a是一个char型指针变量,其值(指向)可以改变;
b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变 。
3、内存地址不同
#include<stdio.h>
int main()
{
char *a="Hello World";
char b[]="Hello World";
printf("%s, %d\n","Hello World", "Hello World");
printf("%d %d\n", a, &a);//a的地址,a的地址的地址
printf("%d %d\n", b, &b);
}
结果可见:尽管都对应了相同的字符串,
但"Hello World"的地址 和 a对应的地址相同
"Hello World"的地址与b指向的地址有较大差异;
所以,&a 、&b都是在同一内存区域,且&b==b
根据c内存区域划分知识,局部变量都创建在栈区,而常量都创建在文字常量区,显然,a、b都是栈区的变量
但是a指向了常量(字符串常量),b则指向了变量(字符数组),指向了自己(&bb&b[0])。
---------------------------
“朝着一个既定的方向去努力,就算没有天赋,在时间的积累下应该也能稍稍有点成就吧。”