内容简介:
1、指针常量与常量指针,
2、指针与数组,
3、指针与函数,
4、指向指针的指针,
5、*void指针
指针://也叫指针地址,即一块内存地址
注意:
指针若没有初始化就拿去用,是很危险的,程序会崩溃(crash)——>野指针调用
一、指针常量与常量指针
指针常量: 是指针,指向的地址不可变(eg: 数组)
常量指针: 指向常量。
二、指针与数组:
【1】用指针遍历数组:
//遍历数组
int a[] = {10,
20,
30, 40,
50};
int count =
sizeof(a) /
sizeof(int);
//传统遍历
for
(int
i = 0; i < count; i++) {
printf("a[%d] is %d\n", i, a[i]);
}
//指针遍历
int
*p = a;
//不改变p的指向
for
(int
i = 0; i < count; i++) {
printf("a[%d] is %d\n", i, *(p + i));
}
//改变p的指向
for
(int
i = 0; i < count; i++) {
printf("a[%d] is %d\n", i, *p);
p++;
}
【2】*p++; *(p++); *(++p); ++(*p); (*p)++
int a[] = {10,
20,
30, 40,
50};
int
*p = a;
//以下语句均单独运行:
printf("%d\n”, *p); //10
printf("%d\n",
*(p++)); //10 先把p取出,*p,然后再++
printf("%d\n",
*p++); //10 //与上一个的效果一样
printf("%d\n",
*(++p)); //20 //p指向第二个元素,即a[1],<==>*(p+1)或*(a+1)
printf("%d\n",
++(*p)); //11 //<==> ++a[0]
printf("%d\n",
(*p)++); //11 //<==> a[0]++
【3】访问数组元素:
for(int i = 0; i< 5; i++){
//四种方法,任一即可
printf("%d\n”,
a[i]);
printf("%d\n”, *(a + i));
printf("%d\n”, *(p + i));
printf("%d\n”, p[i]);
}
三、指针与函数:
【1】指针函数:是一个函数,返回值是指针
(1)//指针函数
char
* string(){
return
"wxhl";
}
//调用:(main函数中)
printf("wxhl is %s\n", string());
(2)//参数中带指针
void
sum(int
a,
int b,
int *result){
*result = a + b;
}
//调用:(main函数中)
int
a =
10, b =
5,
result =
0;
int *p = &result;
sum(a, b, p);
printf("a = %d, b = %d, result = %d\n", a, b, result);
【2】函数指针:是指针,指向一个函数
【】#include
<stdio.h>
int
sum(int
a,
int b){//加法函数
return a + b;
}
int
minus(int
a,
int b){//减法函数
return a - b;
}
//在main函数中定义一个函数指针
//函数指针的类型取决于指向函数的返回值类型
int
(*p)(int,int)=sum;//<==>int
(*p)(int a,int b)= sum;
//使用
int result = p(10,
20);
printf("result is %d\n", result);
【】//我们可以将一个函数指针作为参数
int
testFun(int
a,
int
b,
int
(*p)(int
a,
int
b))
{
//调用函数指针p
int
result = p(a, b);
//a、b在此处是实际参数,传入到函数指针p指向的函数中
return
result;
}
int
main(int
argc,
const
char * argv[]) {
//main中使用函数指针testFun
int
result;
result = testFun(8,
2, p);//p可换成sum
printf("result is %d\n", result);
result = testFun(8,
2, minus);
printf("result is %d\n", result);
【】对于void函数,函数指针的使用:
void
test()
{
printf("hehe\n");
}
//定义一个函数指针,指向test函数
void (*p1)() = test;
//使用
p1();
四、指向指针的指针:
int a =
10;
//指向数值的指针
int *p1 = &a;
// p2中的指针地址,指向p1
int **p2 = &p1;
printf("%d\n",**p2);
五、*void 指针
/*void指针可以指向任意类型*/
int
a =
10;
char
*string =
"wxhl";
printf("string is %s\n", string);
void *p1 = &a; //指向数值的指针
void *p2 = string; //指向字符串的指针
printf("a = %d\n", *((int
*)p1));
printf("string is %s\n", (char
*)p2);
五、QUestion
(1)什么是指针变量?
(2)怎么取出一个变量的指针地址,怎么取出指针指向的目标地址?
(3)如何通过指针遍历数组?
(4)什么是指针函数,什么是函数指针?
(5)什么是双重指针如何定义一个双重指针变量?
(6)数组中的数据元素在内存中是如何分配的?
(7)函数指针有什么作用?
版权声明:本文为博主原创文章,未经博主允许不得转载。