目录
const char* arr和char arr[10]的区别
指针与数组
- 指针可访问数组下标
- 如下,在输出函数Show中利用指针P访问数组arr的下标
void Show(int* p, int length)//输出函数 { for (int i = 0; i < length; i++) printf("%d", p[i]); //或者printf("%d", *(p+i)),p[i]等价于*(p+i) } int main() { int arr[] = { 1,2,3,4 }; Show(arr, sizeof(arr) / sizeof(arr[0])); }
指针与const
const
- C和C++区别:
- 在c中,const 是只读变量
- C++,const 是常量
const的作用
- 可以定义一个常量
- const int a=10; //a为常变量,不可修改
- 常量必须在定义时初始化,不能定义后再赋值
- const int a; a=10;//这样就不对
- 可以定义函数参数
char *strcpy(char *dst, const char *src);//const char *src,表示函数strcpy不会修改 src指向的内容
- 提高程序健壮性和可读性
const 可以修改函数形参——提高程序的可读性和健壮性
例:char *strcpy(char *str1,const char *str2);//复制函数
第二个字符串有const,程序员一看看过去就会知道,将不可修改的字符串str2放到可修改的字符串str1内,提高程序可读性。
与此同时,加了const,不可被修改,提高程序健壮性
- 可以定义函数的返回值
- const char *str = GetString(); //表明该函数返回内容不能被修改
- 补充一道面试题~
问:char *strcpy(char *dest,const char *str);该函数中,第一个cosnt代表的是目的字符串首地址,为什么还需要函数返回值?
答:为了实现链式表达式(函数整体作为另外一个函数的参数出现)
- 可以定义常成员函数
- 常成员函数:在函数的()后面加const
- void Show()const;
- 在当前函数中不能修改本类数据成员的值
const int *与 int* const
- const int *p=&a; //允许p指向a,但是不可修改a,p可以任意指向。a是常量,不允许修改。
- int* const p=&a; //此时,const修饰p变量,p只能指向a,也可修改a(当前仅当a是变量),但是p不可以任意指向。
- (可以这样理解记忆,只记忆哪个不能变:const int *p=&a,const后面是int *p,因为*p=a,所以a的值不变 ;int* const p=&a,const后面是p,修饰p,p格子内容是a的地址,p被const,因此格子不变,p的指向不变。
- 补充例题
解:
const在*前面:const修饰的是内容
const在*后面:修饰的是指针=============p1=========================================
p1指向a
*p1=10
const在*前面,修饰*p1,说明10不能修改,但可以修改a,修改了a,*p的值也修改了;但不能通过修改*p来修改a。
============p2==========================================
不用关注int的位置,只用看const和*的位置就行,因此,p2和p1等价
============p3==========================================
p3是指针型变量,const修饰的是p3本身,而不是*p3,p3不能修改,*p3可以修改,修改了*p3,a同时也会被修改。但是p3不能被修改指向
============p4==========================================
p4是指针型变量,第一个const修饰p4指向的内容,第二个const修饰p4,说明p4不能修改,也不能修改p4的指向
const的错误使用
- const int a=10; int* p=&a;/
- 第二行定义指针p指向a可修改a,但第一行定义a为常量不允许被修改,自相矛盾,所以编译器提醒错误
- const int a=10; int *const p=&a;
-
![]()
- 第二行的说明p可以修改a的值,但第一行定义a是常变量,自相矛盾。
- 这样写是对的,因为第一行的含义是不能修改a的值
const char* arr和char arr[10]的区别
- 内存上:
- 指针占用4个字节,数组的内存可能比较大
- 使用上:
- 当字符串常量赋值给指针和数组后,指针不可以修改字符串,而数组可以修改字符串的值:因为数组是把字符串常量“复制”到数组内,是可以修改的;而指针的声明,指向的是字符串常量的地址,常量只读不可修改。
结构体与const
- 强调一下修改const的问题:
- 举例下面定义一个student的结构体,内部有姓名,年龄和性别的变量:
struct Student { const char* name; int age; char sex; }; int main() { struct Student s1 = {"李四",14,"男"}; }
- 说明:在结构体内定义const char* name,指明姓名不能被修改,这样的用法是正确。但如果用const修饰性别时(const char sex),可以将s1.sex=‘女’修改指向。“男”修改为“女”,但不能将“男”修改为“男性”,意思就是:修改时,并不是修改原来的字符串,而是修改了变量的指向。