C语言 单引号和双引号

      刚开始学习C语言时没有注意过这个问题,最近看了狄泰软件的唐老师C进阶视频时发现这里面还有东西需要注意的,下面我讲下,希望对新人有所帮助(这里面讲的内容主要参考狄泰软件的唐老师C进阶教程中的单引号和双引号课题)

      单引号:单引号实际就是字符字面量,字符字面量就是字符(就是ASCII对应字符),就是整数

     双引号:双引号实际就是字符串字面量,字符串字面量就是字符指针,就是字符首地址

下面通过几个代码来加深印象(感觉很多概念都必须通过代码反应,不然印象不深刻,时间一长就忘了)

平台:ubuntu10  gcc编译器

#include <stdio.h>
int main()
{
    char* p1 =  1 ;
    char* p2 = '1';
    char* p3 = "1";
    printf("%s, %s, %s", p1, p2, p3);
    printf('\n');
    printf("\n");

    return 0;
}

编译过程会出现警告,执行时会出现段错误,就是打印p1,p2,p3导致段错误

首先分析原因:p1 = 1,这样p1指针就指向内存0x00000001地址,p2 = '1' ,'1'字符值是0x31,所以p2指针就指向内存0x00000031地址,而p3 = “1”,“1”是字符串,所以p3就指向"1"字符串内存首地址

这里我们知道内存地址不是所有的地址都可以访问的,比如内存0x00000000首地址,就不能访问,所以p1和p2指针都是不对的,执行会报段错误,而p3指向保存"1"字符串首地址是正确的,因为"1"字符串是保存在内存允许访问的内存地址处的

printf("%s, %s, %s", p1, p2, p3);

我们把上面这一行屏蔽掉,再进行编译,执行,发现还是段错误

这会是

printf('\n');

这行段错误,这是因为printf函数,第一参数是字符串指针,只能接收字符串首地址,而这里传输的'1'字符是0x00000031,但是这里在内存地址是不允许访问的,所以又出现段错误,其实画成图片就很好理解了




从上面图片可以看出,只有从0x08048000内存地址开始之后才可以存储变量,访问变量,而上面地址是不允许访问的,访问就会出现段错误

现在看下下面代码有什么问题


从上面分析得出结论,C语言编译器允许字符串对字符进行赋值,但是没有任何意义,因为是把内存首地址赋给了字符了

下面再来分析一个程序

#include <stdio.h>
int main()
{
    char c = " ";
    while( (c == "\t") || (c == " ") || (c == "\n") )
    {
        scanf("%c", &c);
    }
    return 0;
}

发现没有输入,执行完了,什么都没有,来我们分析下

char c = "";字符串赋给了1个字符变量,相当于内存地址赋给了1个字符变量

while( (c == "\t") || (c == " ") || (c == "\n") )

这行是判断c字符是否等于" "字符串首地址,显然两个" "字符串是不会相等的,肯定存在不同的内存地址,肯定不会相同的,所以while括号里面执行为假,所以不会执行,那这里考察是什么知识点,实际它是把字符和字符串搞混了,理论程序应该是这样的

char c = ' ';

while((c == '\t') || (c == ' ')||(c == '\n'))

{

       scanf("%c",&c);

}

所以我们这会总结下:

1、C语言中单引号用来表示字符字面量的,字符字面量就是字符就是整数

2、C语言中双引号用来表示字符串字面量的,字符字面量就是字符指针,就是字符串首地址,是个地址

3、C编译器允许字符串对字符变量赋值,只能得到字符串首地址,没有任何意思

4、printf()函数的第一个参数是接收字符串首地址

5、内存的低地址空间不能在程序中随意访问

  • 25
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值