问题:
1.野指针?
2.char *p;?
3.int **t?
4.A:int (*p)[3];是什么?
B:Int *p[3];是什么?
5.指针的字长(字节长度)?
6.指针的运算?
7.指针最多可包含几层间接引用?
8.常量指针和指针常量?
9.指针void:void *p ?
10.函数指针和指针函数?
解答:
1. 指针可以将数据写入内存中的任意位置,野指针:指向一个错误位置的指针。存放在 堆的数据可能会被破坏,用来处理堆的数据结构也可能会被破坏,甚至操作系统的p 据也可能被修改;所有要int *p = ”NULL”。
2.”p”:是一个字符、变量、并且有内存空间,内部存的是所指数据的地址。
“*”:为指针运算符,也称间接引用运算符;程序间接引用一个指针是,实际上是引 用指针所指向的数据。
3.int **p是定义一个二级指针变量p;一级*p的值是二级指针p的地址。
Int a = 10;
Int *p;//定义一个int类型的一级指针变量
Int **t;//定义一个int类型的二级指针变量
p = &a;//使一级指针p指向变量a的地址
t = &p;//使二级指针t指向一级指针p的地址
printf(“%d”, a);//输出10
printf(“%d”, *p);//输出10
printf(“%d”, **t);//输出10
4.A:p为指向含3个元素的一维整形数组的指针变量(是指针)
B:定义指针数组p,该数组由三个指向整形数据的指针元素组成(是数组)
5.指针内部的值就是指针所指的地址,所以指针在16位操作系统中位4个字节,32位 操作系统为8个字节,64位操作系统位16个字节。
6.算术运算:
A:指针 -+ 整数
B:指针 - 指针:只有当两个指针指向同一个数组中的元素时,才允许从一个指针
减去另一个指针,两个指针相减的结果的类型为ptrdiff_t,是一种有符号的整形类型。减法运算的值是两个指针在内存中的距离(以数组为单位,而不是以字节为单位),因而减法运算结果将除以数组元素的类型的长度。
如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的。
关系运算:
< <= > >=:指向同一数组
任意指针间可以执行相等不相等测试,指针要不指向同一地址,要么指向不同地址。
7.至少可以有12层
8.常量指针:(const char* p)即指向一个常量的指针,指向的内容是常量,不可以被修 改,放在常量区的,但指针本身(也就是它的值)可以修改,即“*p = b” 是非法的,*p是p指向的常量的第一个字符,是个常量,不能被改变的。“p = &q”是合法的,指针可以指向不同的地址?
指针常量:(char* const p)即指针本身就是一个常量,不可被修改,但指针指向的内 容可以被修改,一开始定义它指向数组a,“*p = ‘b’”这是可以的,但“p = &b” 是非法的。
9.p指向的对象不属于任何类型;任何时候可以用其他类型的指针来代替void指针;或 者用void指针来代替其他类型指针;并且不需要强制转换;可以把char*类型的指针 传递给需要的void指针的函数。
10.函数指针:即指向这个函数的指针,定义为“数据类型 (*fun)(参数列表);”,()的 优先级比*高,所有*fun加括号,如(void (*fun)(int*,int*);)
指针函数:即返回值是指针的函数,定义为“数据类型 *fun(参数列表);”,如“char* fun(int*, int*);”,即返回值为char*型。