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

[避免以后不小心犯错,再科普一次,警惕一下,呵呵^^]

 

(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;//正确

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值