1. 数组作为参数传递给函数时,可以通过 sizeof 得到数组的大小吗
答案是不可以。当把数组作为函数的参数时,你无法在程序运行时通过数组参数本身告诉函数该数组的大小,因为函数的数组参数相当于指向该数组第一个元素的指针。
2. 可以把另外一个地址赋给一个数组名吗
答案是不可以。数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。
给数组名赋值是毫无根据的。一个指针的含义是 “这里有一个元素,它的前后可能还有其他元素” ,一个数组名的含义是 “这里是一个数组中的第一个元素,它的前面没有数组元素,并且只有通过数组下标才能引用它后面的数组元素” 。因此,假如需要使用指针,就应该使用指针。
3. 指针是什么
指针是变量。系统为指针分配内存空间;指针有自己的地址;指针能够存值,但这个值比较特殊,存的是地址。
4. 怎样判断指针的类型和指针所指向的类型
从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型,这是指针本身所具有的类型。
例:
1)int *ptr; //指针的类型是 int*
2)int **ptr //指针的类型是 int**
3)int *(*ptr)[4] //指针的类型是 int *(*)[4]
通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当作什么来看待。
从语法上看,只须把指针声明语句中的指针名字和名字左边的指针声明符 “*” 去掉,剩下的就是指针所指向的类型。
例如:
1)int *ptr; //指针所指向的类型是 int
2)int **ptr; //指针所指向的的类型是 int*
3)int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]
5. 常量指针和指针常量的区分
举例说明:
1)const char *p;
2)char* const p=a;
语句 1 定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以修改,即 " *p = 'b' " 是非法的,*p 是 p 指向的常量的第一个字符,是个常量,不能改变的。"p = &q" 这是可以的,指针可以指向不同的地址。
语句 2 定义了一个指针常量,即指针本身是个常量,不可修改,但指针指向的内容可以修改,一开始定义时让它指向数组 a ,"*p = 'b'" 这是可以的,但 "p = &b" 是非法的。
const 常量 * 指针,当 const 在 * 之前就是常量指针,而 const 在 * 之后,就是指针常量。例如,"const char*p”即 char *p 是个常量,所以内容是常量,"char* const p; " 即指针 p 是个常量。
6. 常量指针和指针常量使用的注意点
1)如果指针常量指向的是字符指针变量,那么当修改*p时,原则上能够修改,在编译时能通过,但在运行时不能通过,因为它试图去修改常量区的内容,显示是非法的。
2)当指针常量指向一个另外一个指针时,当这个指针指向别的内容时,那么指针常量还是指向原先的内容。
7. 什么是空指针?空指针有什么用?
空指针是不指向任何对象的指针。空指针的值是NULL,即0。空指针可以作为一个链表的终值。如果一个链表的最后一个指针指向NULL,则该链表已经结束。
注意:绝对不能间接引用一个空指针,否则,程序可能会得到毫无意义的结果,或者得到一个全部是 0 的值,或者会突然停止运行。
8. C语言为什么要提出指针
C语言可以直接访问硬件,而访问时需要硬件的地址。
9. 指针数组和数组指针的区别
指针数组:定义一个数组,数组里包含 n 个指针变量;
数组指针:定义一个指向含 n 个数据元素的数组的指针。
10. 函数指针和指针函数的区别
函数指针:即指向这个函数的指针,定义为 “数据类型 (*fun)(参数列表);”,()优先级比 * 高,所以 *fun 加括号,如 "void (*fun)(int*, int*); ” 。
指针函数:即返回值是指针的函数,定义为 “数据类型 *fun(参数列表); ”,如 "char* fun(int*,int*);",即返回值为 char* 型。