字符型指针变量与字符数组的区别

字符型指针变量与字符数组的区别:
(1)
分配内存
假设有字符型指针变量与字符数组如下:
char *p ,s[10];
编译器为字符数组s分配10个字节内存,用于存放10个字符。而编译器只为指针变量p分配4个字节内存。


(2)
初始化赋值含义

字符数组与字符指针的初始化赋值形式相同,但其含义不同。例如:
char s[ ] ="I am a student ! " ;
char *p="You are a student too ! " ;
对于字符数组是将字符串放到为数组分配的存储空间去,而对于字符指针是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针p中。

  
(3)
赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量,

字符串地址可直接赋给字符指针变量。例如:
s="I love China! "; //
字符数组名s不能直接赋值,该语句是错误的。
p="I love China! "; //
指针变量p可以直接赋字符串地址,语句正确
下面这个例子:编译报错:error C2440: “=”: 无法从“const char [7]”转换为“char [30]”

#include <string.h>
#include <iostream>
using namespace std;

void main()
{

char s[30];

char *p=0;

p="hello world";

s="hello world"; //
错误:C2440: “=”: 无法从“const char [7]”转换为“char [30]”

printf ("%s\n",p);

printf("%s\n",s);

return;
}

但是对字符数组初始化时可以:

char s[]="hello world"; //正确

char *p=0;

p="hello world";

 

(4)输入方式

可将字符串直接输入字符数组,而不能将字符串直接输入指针变量。但可将指针变量所指字符串直接输出。
例如:scanf("%s",s); //正确
scanf("%s",p); //
错误

例如下程序:

#include<stdio.h>
int main()
{
char *a;
//int i;
//for(i=0;i<3;i++)
scanf("%s",a);
printf("%s\n",a);
return 0;
linux下能编译运行 但运行时提示Segmentation fault

原因是定义了一个字符指针,但指针没有确定地址,所以出现了段错误(即内存空间越界)。

printf("%s",p);//
正确

(5)
值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。例如:

s=s+5; //错误
p=s+5
//正确

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值