- 指针的小结
- 首先要准确地弄清楚指针的含义。指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替,例如,变量的指针就是变量的地址,指针变量就是地址变量
- 要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。
void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换
3.要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址int *p,a[10];
p=a;
p是指向int类型的指针变量,p只能指向数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。
对“p=a;”,准确地说应该是:p指向a数组的首元素
4.指针运算(1)指针变量加(减)一个整数
例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指针变量加(减)一个整数。
将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。
(2)指针变量赋值
- 将一个变量地址赋给一个指针变量
- 不应把一个整数赋给指针变量
(3) 两个指针变量可以相减
如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数
(4) 两个指针变量比较
- 若两个指针指向同一个数组的元素,则可以进行比较
- 指向前面的元素的指针变量“小于”指向后面元素的指针变量
- 如果p1和p2不指向同一数组则比较无意义
(5) 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:
p=NULL;
5.指针为NULL时不能引用,引用将会出现 漰溃,例如: char *p = NULL; char a = *p;- 指针加1或减1,所指向的地址移动的大小与指向的对象有关。
1.字符指针加1或减1,将移动1个字节的地址
2.短整型指针加1或减1,将移动2个字节的地址
3.整型,长整型,单精度浮点型指针加1或减1,将移动4个字节的地址
4.双精度浮点型指针加1或减1,将移动8个字节的地址
5.其它自定义数指针加1或减1,将移动一个自定义数据长度的地址
1、定义指针时,把指针变量赋值成NULL
2、释放内存是,先判断指针变量是否为NULL
3、释放完内存后,把指针变量重新复制成NULL
- 函数调用的时候,这个场景修改不了实参
int FreeMem1(char *p)
{
if (p == NULL)
return -1;
if (p != NULL)
{
free(p);
p =NULL;//只是把形参重置为NULL,但是实参并没有改变
}
return 0;
}
解决FreeMem1释放空间指针不能重置问题int FreeMem2(char **p) { //实参地址传过来了
if (*p == NULL)
return -1;
if (*p != NULL) {
free(*p);
*p =NULL;//把实参重置为NULL,不会产生野指针
}
return 0;
}
常量指针和指针常量- const int * p1; //指向的对象是常量
- int const *p2; //指针本身是常量
- const int const *p3; //指针本身是
//常量且指向的对象是常量
*p1=8;//错误 p1++; //正确
*P2 = 8;//正确 p2++; //错误
*P3 = 8;//错误 p3++; //错误
指针数组和数组指针- int *p1[4]; //是一个数组,有4个指针元素
- int (*p2)[4]; //是一个指针,指向一个有4个元素的一维数组
int a = 10; int *p3 = &a;
int **p4 = &p3; //是一个二维指针,指向另一个指针p3
函数指针
例如:
int *(*func)(int (*f)(int *x,int *y));
函数类型为:int*
函数指针名为:func
函数指针的参数是另一个函数指针int (*f)(int *x,int *y)