关于const char *s和char * const s
来源:互联网 发布:雅思阅读怎样提高知乎 编辑:程序博客网 时间:2024/06/04 18:33
首先要明确的一点,无论是const char *s还是char * const s,这里的s都是指针。
我对这两种声明的理解方式是:看const右边接的是什么,则const修饰的就是什么。
const char *s中,可以把const右边分成char和(*s)两个部分看,显然char和(*s)在代码里指的都是字符,所以const char *s指的是s指向的字符(串)是常量,不能修改,而s指针本身是可以修改的。
char * const s中,const右边只有一个s,显然在代码中s指的是指针,所以char * const s指的是s指针本身是常量,不能修改,而其指向的字符串可以修改。
除此之外,还特地就google的一道笔试题做了一个小测试。
[题目]const char *p="hello";
foo(&p);//函数foo(const char **pp)
下面说法正确的是[]
A.函数foo()不能改变p指向的字符串内容
B.函数foo()不能使指针p指向malloc生成的地址
C.函数foo()可以使p指向新的字符串常量
D.函数foo()可以把p赋值为 NULL.
测试代码如下:
/************************************************************************* > File Name: test.c > Author: Julian Wang > Mail: 13508417@qq.com > Created Time: Wed 10 Jun 2015 06:20:06 PM CST ************************************************************************/#include<stdio.h>#include<stdio.h>int main(){const char *s = "hello";printf("%s\n", s);s++;++s;/*waring*/char *p = s;/*compile error*///*s = 'c';/*warning,core dump*///*p = 'c';/*warning,core dump*///snprintf(s , 3 , "%d", 11);/*warning,core dumped*///snprintf(p , 3 , "%d", 11);printf("%s\n", s);/*warning*/s = (char *)malloc(1000 * sizeof(char));/*compile error*///*s = 'a';/*warning,but it works!*/snprintf(s , 10 , "%d", 12345);printf("%s\n", s);return 0;}
从程序的编译和运行结果可以看出。
(1)对于(*s)=‘a’;这样直接通过指针s对字符串赋值的语句,则无论如何编译器都会报错。
(2)对于const char *s = "hello";指针s初始化的那部分内存区域,也即本例中的“hello”,不论以何种方式对其进行修改(包括使用一般的指针p,snprint函数),可以编译通过,但运行时都会报段错误——Segmentation fault (core dumped)。
(3)如果让s指向malloc出的一块新的内存区域,并且用snprintf函数对s指向的这片区域进行赋值操作,虽然编译会报warning,但是确实可以完成赋值。
故我的答案为ACD。
- 关于const char *s和char * const s
- const char *s 和 char * const s 区别
- char s[] 和 const char s[]和char *s和const char *s 是否可以修改元素。
- 关于const char*, char const*, char*const
- 关于const char*, char const*, char *const
- const char * 、 char const * 和 char * const
- size_t strcspn(const char *s, const char * reject);
- char *strtok(char *s, const char *delim) 用法
- const+char*+和+char*+const
- const char*和char* const
- const char*和char* const
- char *和const char *
- 关于const char 和 char 能否相容
- strrchr(const char * s,int c)
- 关于const char*p和char *const p
- 关于 sprintf (char*, const char*, ...)...
- 关于const char*和char*、const char** 和char** 赋值问题
- 关于const char*和char*、const char** 和char** 赋值问题
- P225 5
- 数组指针和指针数组的辨析
- Laravel 学习笔记 —— 神奇的服务容器
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
- Mybatis学习(五)mybatis环境下以接口的方式进行的增删查改
- 关于const char *s和char * const s
- 认识自己——趋利避害生活的能力
- A Type-Safe Event System for Unity3D
- P268 1
- HOG特征—简介
- Laravel查看当前已有的路由信息
- Android的selector,背景选择器 以及.9.png
- 各种在线手册
- P269 2