C++中疑问点
1.const char *a与char const *a与char *const a的区别
问题:
说出以下四个语句的区别:
const char *a
char *const a
char const *a
const char *const a
const和指针的基础知识:
指向常量的指针(C++Primer上叫 指向常量的指针)(底层const):自觉不去(靠它自己也不能)改变所指对象,而该对象若不是常量对象则其值通过其他方式改变所指对象。总之,const可绑定非const。(指针所指对象的内容固定)
常量指针(C++Primer上叫 常量指针)(顶层const):由于指针为常量,所以声明时必须初始化,且初始化后存放在指针中那个地址不可改变。但此地址对应的数可被改变:指针常量若所指对象是常量,指针常量不能修改其所指对象的值;指针常量若所指对象是非常量,指针常量也能通过指针修改其所指对象的值。(指针所指对象固定)
解答:
const char *a
声明(*a),(*a)是const char类型的。a被一个解引用运算符修饰,故a是个普通的指针,可以修改,但是a所指向的数据(即 *a)由于const的修饰而不可通过指针a去修改。(数据内容不可改,指针可改)char *const a
声明(*const a),(*const a)是char类型的。a被一个解引用运算符和一个const关键词修饰,故a是个不可修改的指针,但可通过指针a去修改a所指向的数据(即 *a)。(指针不可改,数据内容可改)char const *a
和const char *a
是同一个意思。- 如果既不允许a被修改,也不允许a所指向的数据被修改,那么需要声明为
const char * const a
。
转载自:https://blog.youkuaiyun.com/BillCYJ/article/details/78879847
2.二维数组做形参
1)二维数组
定义:在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组。因此,二维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照行顺序存储的,因此当按存储顺序访问树时,最右边的数组下标(列)变化的最快。
2)二维数组做形参
规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。
因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组。因此二维数组作为函数参数正确写法如下所示:
void Func(int array[3][10]);
或void Func(int array[ ][10]);
因为数组的行数无关紧要,所以还可以写成如下形式:void Func(int (*array)[10]);
(指向数组的指针,数组指针) 注意:*array需要用括号括起来。
这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。因为[]的优先级比 * 的优先级高,故*array必须用括号括起来,否则变成了void Func(int *array[10]);
这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。
但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:void Func(int array[ ][ ]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的: void Func(int array[3][ ]);
转载自:https://www.cnblogs.com/alantu2018/p/8465894.html