字符数组与字符串,字符数组与字符指针(总结大全)

1.误区:字符数组就是字符串

来自:http://www.quanxue.cn/JC_CLanguage/CLang/Clang10.html

  1. 字符数组,完整地说叫字符类型的数组。字符数组不一定是字符串。
  2. 字符串是最后一个字符为NULL字符的字符数组。字符串一定是字符数组。
  3. 字符数组的长度是固定的,其中的任何一个字符都可以为NULL字符。
  4. 字符串只能以NULL结尾,其后的字符便不属于该字符串。
  5. strlen()等字符串函数对字符串完全适用,对不是字符串的字符数组不适用。
#include <stdio.h>
#include <string.h>

int main(void)
{
    //这是字符数组赋初值的方法
    char cArr[] = {'Q','U','A','N','X','U','E'};
    //这是字符串赋初值的方法
    char sArr[] = "quanxue";

    //用sizeof()求长度
    printf("cArr的长度=%d\n", sizeof(cArr));   //长度为7
    printf("sArr的长度=%d\n", sizeof(sArr));   //长度为8,最后一位是NULL

    //用printf的%s打印内容
    printf("cArr的内容=%s\n", cArr);   //不能正确显示
    printf("sArr的内容=%s\n", sArr);   //可以正确显示

    //用strlen()求长度
    printf("cArr的长度=%d\n", strlen(cArr));   //不正确的结果
    printf("sArr的长度=%d\n", strlen(sArr));   //NULL不在计算范围

    return 0;
}

2.字符数组与字符指针

首先在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中。

其次字符数组保存的字符串属于字符串变量,可以被修改,而字符指针指向的字符串是属于字符串常量,不能被修改。

#include <stdio.h>

int main()
{
    char str[12] = {'h','e','l','l','o',' ','w','o','r','l','d'};
    char* ptr = "hello world";
    str[0] = 'f';
    ptr[0] = 'f';  //将字符指针指向的字符串修改,将出现段错误,因为该内存地址只读(常量区),因为该字符串属于常量
    return 0;
}

3.关于其它自己验证的代码:

#include <stdio.h>

void main()
{
    char a[] = "hello";
    
    char b[5] = "hello";
    char *c = "hello";
    printf("sizeof:%d,strlen:%d,%s\n", sizeof(a),strlen(a), a);
    printf("sizeof:%d,strlen:%d,%s\n",sizeof(b),strlen(b), b);
    printf("%c", a[5]);
    printf("sizeof:%d,strlen:%d",sizeof(c),strlen(c));

    
    int i;
    for(i=0;i<sizeof(a);i++)
	{
	    printf("%c", a[i]);
	}
}
输出:
sizeof:6,strlen:5,hello
sizeof:5,strlen:5,hello
sizeof:4,strlen:5hello

解释:关于sizeof(c),算的是指针大小。其实c和a的存储空间一样大。都是6。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值