一、char *a
P109:
(1)(变量)指针变量:指针变量,即指针的定义:用来存放指针的变量。指向的是变量,且可以改变其指向的地址。P104 char *a
(2)(变量)指针常量:指针常量,指向的是变量首字节的地址,但不能修改指针所指向的地址。在定义的同时必须初始化。char * const a = &p
(3)常量指针(变量):常量指针,指向的是常量(如常量字符串(首个字符)、常量字符数组(首个元素的地址)),因此不能通过运算及重新赋值,修改指针所指向地址的内容。
如通过(数组名) 修改字符数组中的第一个元素的值会提示:表达式必须是可修改的左值,无法修改。
但仍然是一个指针变量,因此可以改变指针所指向的地址。上面的①字符串常量指针,及②数组名都可以看作是常量指针。
其中①字符串常量指针,分为两种情况:
当只有一个字符串指针时,一定没有方括号[] . 后面只能有一个常量字符串指针且使用双引号,可以加花括号也可以不加。
此时必须要用const char * a; 或char const * a; 这两种形式做形式参数。
即不能少const修饰char.
const char * a = "abc"; //等价于const char* a = { "abc" };
当至少有两个字符串常量指针,则必须转为 字符串常量指针数组 数据类型;或者只有一个字符串常量指针,但明确定义了是指针数组时:
即当是 字符串常量指针数组 时,则一定有了方括号[]. 此时后面也一定要加花括号,每一个字符串常量元素都用双引号括起来。
指针数组中只有一个字符串常量指针元素时也要用方括号和花括号。
const char* a[] = { "abc" };
//这里a是字符串常量指针数组。注意区别上面的const char* a = { "abc" }; 是常量字符串指针,数据类型的本质有区别。
//根据字符串元素数量决定定义(字符串常量指针还是指针数组?),根据定义决定后面是用还是不用,及用哪种[]、{}、""、'',而不是相反或者死记硬背
const char* b[] = {"abc","def"};
②数组名常量指针,可以用const char * a; 或char const * a; 或char * a三种形式,一般是用char * a.
已经定义了一个数组,这里只是数组名称,而并非上面的指针数组整体结构。
(4)常量指针常量:指向的是常量首字节的地址,且不能改变其指向的地址。
二、char *a[]
定义一个指针数组a,其元素都为指针。
三、char *a()
P123 函数a的返回值是一个指向char类型的指针。
四、char (*a)()
P123 指向函数的指针
定义了一个指向 返回值为char类型的函数 的指针a.
五、指向函数的指针数组
指针数组中的指针元素,均指向函数。