const
如果const关键字写在类型名称前,就表示指针本身的内容可以被赋值,但是不可以通过这个指针
对它所捆绑的存储区进行赋值
所有用来实现跨函数使用存储区的指针,都尽量按照上述方法加const关键字
在声明指针的时候,可以把const关键字加在指针变量名称前,这种指针本身不可以被赋值,但可以
通过它对捆绑存储区进行赋值
1. 指针基础
指针变量:用来记录存储区的地址
只有记录有效地址的指针才可以使用
只有有效指针前加*, 表示指针变量的捆绑存储区内容
int *p
指针变量:p
指针类型:int *
指针所指向的类型:int
指针的值:p的值既地址的值
无效指针分为两类:
1.空指针里记录的是空地址(NULL), 它的数值就是0.
2.所有其它无效指针统称为野指针
程序中禁止出现野指针
没有初始化的指针就是野指针
int *p = NULL; //对指针初始化,此时只是对指针变量p初始化
指针与存储区内容之间的捆绑关系随着程序的执行,可以不断的变化.
无类型指针:
在声明指针的时候,使用void作为类型名称,这种指针叫做无类型指针
这种指针可以和任何类型的存储区捆绑,不能通过指针了解到捆绑存储区的类型
既不可以对这种指针做加减整数的计算,也不能在这种指针前面加*
必须首先把这种指针强制类型转换成有类型指针,然后才能使用.
这种指针通常多为函数的形式参数
2. 指针与数组
指针与数组的区别:
1.数组名称不可以被赋值,但是指针可以
2.对数组名称和指针分别做sizof计算,结果不同
3.对数组名称和对指针变量取地址,结果不同
数组指针
指针数组:中心词是数组,数组里的元素是指针
int* arr[10]; arr是数组,数组有10个元素,每个元素都是指针,指针对应捆绑区是int
char* str[10];字符指针数组,数组有10个元素,每个元素都是指针,指针对应的捆绑区是char
3. 指针与函数
3.1. 函数形参=指针(int *p)
3.2.函数形参=数组(int arr[])
当函数的形参之一为数组时,可进行跨函数的存储区传递,因为数组名即为数组的首地址,可看做指针
3.3 函数返回值=指针(int *p)
3.3.1.
使用指针类型的返回值存储区,可以让一个函数使用另外一个函数的静态局部变量,非静态局部变量的地址不可以作为返回值使用
为何不能用局部变量作为函数返回值(指针),原因是涉及到内存块,还未完全明白,先记住结论.
指针形参可以作为返回值使用
函数指针
/*
函数指针演示,函数指针用来记录函数的地址
*/
#include <stdio.h>
int add(int num, int num1)
{
return num+num1;
}
int main()
{
int (*p_fun)(int,int)= NULL; //函数指针声明
p_fun = add;
printf("%d\n",p_fun(4,7));
return 0;
}
/*
函数指针当形参
*/
#include <stdio.h>
void print_cb(int *p_num)
{
printf("%d", *p_num);
}
void for_each(int *p_num, int size, void (*p_func)(int *) )//函数指针当形参
{
int num=0;
for(num=0;num<size;num++)
{
p_func(p_num+num);
}
}
int main()
{
int arr[]={1,2,3,4,5};
for_each(arr,5,print_cb);
printf("\n");
return 0;
}
指针函数
4. 指针与字符串
5. 二级指针
二级指针可以用来记录普通指针存储区的地址
二级指针可以代替指针数组,但是不能代替二维数组
二级指针可以用作函数的形式参数,这样就可以让被调用函数使用其它函数提供的指针类型存储区
/*
二级指针演示
*/
#include <stdio.h>
int main()
{
int num=9;
int *p_num = #//一级指针
int *pp_num = &p_num;//二级指针
**pp_num = 10;
printf("num=%d\n",num);// num=10;
return 0;
}
/*
二级指针形式参数演示
*/
#include <stdio.h>
void setnull(int **pp_num)
{
**pp_num = NULL;
}
int main()
{
int num=0;
int *p_num = #
setnull(&p_num);
printf("p_num=%p\n",p_num);
return 0;
}
6. 总结
参见网址:
http://wenku.baidu.com/link?url=kwEOwMY5CCncSPEuSRdTlwKZb0uNgiyaqex5iqL93YIh2yRQ8pGapptv57R69rY2eSHJfKkmjnUPOQrdjtgn2xhCFJRoLne4z4vk-TsRCh7
http://wenku.baidu.com/link?url=ilJN9Nbnufn5SSl852r5hYNfujCyPGx906yWHnTDrgyB6nX1bMSze2JbbWSZ8m_UDYfOsHtP8toCob2JMWhThGDo0dG_OEL3C_KX8dOobwC
(a).int a;
(b).int *a;
(c).int **a;
(d).int a[10];
(e).int *a[10];
(f). int (*a)[10];
(g). int (*a)(int);
(h). int (*a[10])(int);