C语言中char s[]与char *s的不同

首先看一下C语言中下面两个语句的不同:

char s[10] = “abcde";
char *s = "abcde";

两者不同的关键点如下:
(1)数组
char s[10] = "abcde"
s是一个数组;
sizeof(s) = 10 bytes
a与&a是一样的
abcde存储在内存的栈空间中

char s[10] = "abcde";
s = "hello";这是非法的,因为a本身是一个地址,字符常量”abcde“也是一个地址

s++是非法的

char s[10] = "abcde";
a[0] = 'b';合法


(2)指针变量
char *s = "abcde"
s是一个指针变量;
sizeof(s) = 4 bytes;//32位机器
s与&s不一样
s存储在栈空间中,但是abcde存储在内存的只读区域中

char *s = "abcde";
s = "hello";合法

s++是合法的

char *s = "abcde";
a[0] = 'k';非法,"abcde"处在只读存储区


对于char s[] = "abcde",虽然我们初始化了5个元素,但是它的size是6,因为编译器会自动在末尾加'\0'。


#include <stdio.h>

int main(void)
{
    char s[5] = "asdfd";
    char s1[] = "adsfd";

    printf("%d,%d\n",sizeof(s), sizeof(s1));
    return 0;
}
输出:
5,6

char *s = "asdad",创建一个字符串字面值,对于大部分编译器来说,字符串字面值存储在内存的只读部分,修改它是非法的。s是存储字符串字面值的指针。

#include <stdio.h> 
int main() 

    char *s = "adafda"; 
    printf("%lu", sizeof(s)); 
  
    // 下面这样试图去修改是非法的 
    // (在gcc上会导致段错误) 
    //  s[0] = 'j';   
    return 0; 

输出:8

运行上面的程序有时候会遇到提示“warning: deprecated conversion from string constant to ‘char*’",这是因为s不是一个常量指针,但是存储的确实只读区域的地址,可以修改为const char *s


基础知识:

可以看一下这篇文章,写的挺清楚的

https://blog.csdn.net/daiyutage/article/details/8604720

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值