C中的数组与指针

1)在C中,是将字符串作为字符数组来处理的。

可以用字符串常量来使字符数组初始化。例如:char c[]=”I am happy”;因为字符串常量的最后由系统自动加入一个’/0’。因此,上面的初始化与下面的初始化等价。

char c[]={‘I’, ’ ‘ ,’a’, ’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’/0’};数组的长度为11

2)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值:

    char str[14];

    str=”I love China!”;

而对字符指针变量,可以采用下面办法赋值:

    char *a;

    a=”I love China!”;

(3)对字符数组的初始化 char str[14]= ”I love China!”不能等价于

    char str[14];

    str[]=”I love China!”;

即数组可以在定义时整体赋值,但不能在赋值语句中整体赋值。只能初始化,不能赋值。

4如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。

    而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。

    例如:

        char str[10];

        scanf(“%s”,str);

是正确。

      char *a;

        Scanf(“%s”,a)

是危险的,虽然一般能运行,当绝不提倡。因为编译是虽然给指针变量a分配了内存单元,a的地址(&a)已经指定,a的值并未指定,在a单元中是一个不可预料的值。a可能指向一段空白未用的存储区,也有可能指向已存放指令或数据的有用内存段,这就破坏了程序,甚至破坏了系统。正确的应该这样:

    char *a,str[10];

    a=str;

    scanf(“%s”,a);

(5)注:strlen()没有包括字符串末尾的‘/0’.

Void test()

{

    char string[10],str[10];

    int i;

    for(i=0;i<10;i++)

        str[i]=’a’;

    strcpy(string,str);

}

错误:首先,strcpy(string,str)调用使得从str内存起复制到string内存起所复制的字节数具有不确定性。因为strcpy(char *dest,const char *src)的工作方式是从src起一直复制出现‘/0’才停止复制。

自己写一个strcpy函数:

    char *strcpy(char *strDest,const char *strSrc)

{

    assert((strDest!=NULL) && (strSrc!=NULL));

    char *address=strDest;

    while((*strDest++ = *strSrc++)!=’/0’);

    return address;

}

(6)

    swap(int *p1,int *p2)

{

    int *p;

    *p=*p1;

    *p1=*p2;

    *p2=*p;

}

在上面的swap函数中,p是一个“野”指针,有可能指向系统区,导致出现运行的崩溃。

应该改为:

    swap(int *p1,int *p2)

{

    int p;

    p=*p1;

    *p1=*p2;

    *p2=p;

}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值