您的位置:首页 > 其它

char数组与char指针

2018-03-12 17:13 429 查看

char数组与char指针的区别和联系

字符串(char*)与字符数组(char[])区别

在C语言中,对字符串的操作主要有两种方式:一是字符数组(char[]),二是使用字符指针(char*)。接下来最这两种所使用的情况做彻底的说明:

一、字符数组

字符数组的定义有两种方式:

1.char s
;

n表示数据的大小。该语句可以理解为 声明一个字符数组,并且编译器为该字符数组分配n个内存空间,这是在编译期进行的。

赋值有两种方式:

(1)声明并初始化

char s[10]=”hello,world”;//使用字符串字面值(string literal)来初始化字符数组

(2)已经分配了内存,然后进行赋值。

char s[10];

s[0]=’h’,s[1]=’e’;

错误的赋值方式:

(1)char s[];

s = “hello,world”;

//这表明仅仅声明了一个char数组,但是不知道分配多大内存空间。

(2)char s[10];

s = “hello,world”;//错误

s={‘h’,’e’,’l’,’l’,’o’};//错误 s是指向数组首地址的指针。

二、字符指针

可以使用char *str指向一个字符串如:

char* str=”C++”;//声明一个指向char的指针并进行初始化。

char* str;//声明一个指针。

str =”C++”;

三、两者的区别

1. 既然 char *a 只是定义了一个指针 a,而并不为其指向的字符串分配内存,那么为什么下面两行代码又能够编译通过,且执行结果看上去是正常的?

char *a;

a = “abcde”;

这两行程序的执行过程中,编译器/计算机都做了些什么?

在这两行程序的基础上,为什么赋值语句 *a = ‘A’ 又是不合法的(会导致运行时错误)?

相比于上面两行程序,以下两行也是不合法的,为什么?

char a[];

a = “abcde”;

答:(1)char *a; 这一行中编译器做的事情是,声明一个指向字符的指针,但是没有让该指针分配指向内存,它只是知道有一个变量 a 可能需要放在栈上;

假如后面需要取变量 a 的地址,那么编译器就被迫使 a 占用栈空间.而假如编译器决定使 a 不占用栈空间就要给 a 在它需要保持值的期间保留一个

寄存器, 在执行时计算机不为此做任何事情。

(2)a = “abcde”; //这一行中编译器做的事情是在字符常量内存空间定义一个”abcde”字符串,让字符指针a指向此字符常量内存空间的地址。由于该地址空间

不是在栈内,而存在类似于静态存储区这样的空间。

(3)*a = ‘A’ 之所以会在运行时发发生错误,是因为匿名数组所在的存储空间是不可写的。

(4)char a[];

a = “abcde”;//以上是不合法的。首先,声明数组时如果没有给变量初始化就必须指明数组的长度。

其次,即使改成char a[6];a = “abcde”;也是不合法的,这是因为你不能将指针值赋给一个数组。

或者用一个更简单的说法:类型不同,并且不存在一个隐式转换使得 char* 被转换成 char[6] 。

2. 以下两种初始化方式是否有本质区别?

char a[] = “abcde”;

char *b = “abcde”;

答:从效果上来说,上面两个语句结果是一样的,都获取到字符的首地址。但是本质是不一样的,char 数组的初始化器会先为该数组在栈内分配内存,

然后将匿名数组的内容复制到对象所处的空间中char* 的初始化器会首先在字符串常量空间内存生成一个常量字符串”abcde”,然后将该字符串的首地址

赋值给字符指针对象。

3. 为什么下面的代码

char *a, *b;

a = “abcde”; b = “abcde”;

其运行结果中, a 和 b 会指向同一内存地址?而上一问中得到的 a 和 b 就不会指向同一内存地址。

答:不一定一样,这取决于编译器。

4. 对于数组声明(或初始化)的变量,例如

char a[6];



char a[]=”abcde”;

这句话是否正确?当 a 作为右值(rvalue)时,其类型为 char*;而当 a 作为左值(lvalue)时,其类型就是 char[6]。

答:这句话是错误的。从 char[6] 到 char* 有一个隐式转换,这并不意味着 a 会有飘忽不定的类型。

我有这个疑问,是因为我试过几次,发现以下代码可以正常运行

char a[]=”abcde”;

char *b;

b = a;

答:可以从char[]隐式转换为char* 类型,但是不可以从char*类型转换到char[]类型。

而以下代码会导致类型转换错误

char *a=”abcde”;

char b[6];

b = a;

甚至,以下代码也会导致类型转换错误,且错误提示和上一段代码是一样的

char a[]=”abcde”;

char b[6];

b = a;

5.对于函数参数中的char[]和char*是否一样?

答:在C语言中,数组作为参数,进行传递时,传递的是指针 ,换句话说,字符数组作为参数,进行传递时,

传递的是字符数组的起始地址,相当于一个字符指针,两者没有区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: