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])。

posted @ 2021-11-20 13:31  Dinesaw  阅读(441)  评论(0编辑  收藏  举报