C 语言(二):指针基础
//指针有类型,地址没有类型
//地址只是开始的位置,类型指的是读取什么位置结束
void main() {
int i = 88;
int *p = &i;
double j = 98.2;
//赋值为 double 类型变量的地址
p = &j;
printf("double size:%d\n",sizeof(double));
printf("%#x,%lf\n",p,*p);//*p 的值为 0.000000,
getchar();
}
//见图一效果图
//2.NULL 空指针
void main() {
int i = 9;
int *p = NULL;
//p = &i;
//空指针的默认值为 0
printf("%#x\n", p);
//访问内存地址 0x000000 操作系统不允许
//p = 10;//操作系统不允许访问
printf("%d\n",*p);
getchar();
}
//见图二效果图
//3.多级指针(二级指针)
//指针保存的是变量的地址,保存的这个变量还可能是一个指针变量/*
void main() {
int a = 45;
//p1 上保存的 a 的地址
int *p1 = &a;
//p2 上保存的 p1 的地址
int **p2 = &p1;
printf("p1:%#x,p2:%#x\n", p1,p2);
**p2 = 88;
printf("a:%d\n", a);
*p1 = 78;
printf("a:%d", a);
getchar();
}
//见图三效果图
//4.指针的运算
//指针的运算,一般在数组遍历时才有意义,基于数组在内存中线性排列的方式
void main() {
//数组在内存中连续存储
int ids[] = {78,92,52,45};
//数组变量名称:ids 就是数组的首地址
printf("%#x\n",ids);//0x1dfb28
printf("%#x\n",&ids);//0x1dfb28
printf("%#x\n",&ids[0]);//0x1dfb28
//ids 首地址
//ids 等价于 &ids[0], ids+1 等价于 &ids[1]
//结论:ids+i 等价于 &ids[i]
//*ids 等价于 ids[0] . *(ids+1)等价于 ids[1]
//结论: *(ids+i)等价于 ids[i]
//总结:ids+i 等价于 &ids[i], *(ids+i)等价于 ids[i]
//指针变量
int *p = ids;
//p 是变量指针,ids 常量指针
//p = &i; 可以
//ids = &i;不可以
printf("%d\n",*p);//78
//指针的加法
p=p+2;//p++向前移动 sizeof(数据类型)个字节
printf("%d\n", *p);//52
p--;
printf("%d\n", *p);//92
getchar();
}
//见图四效果图
//5 通过指针给数组赋值
void main() {
int uids[5];
//高级写法
//int i = 0;
//for (; i < 5; i++){
// uids[i] = i;
//}
//早些版本的写法
int *p = uids;
int i = 0;
for (; p < uids+5; p++ ) {
*p = i;
i++;
}
getchar();
}
//6.函数指针
int msg(char* msg,char* title) {
MessageBox(0,msg,title,0);
return 0;
}
void main() {
//msg();
printf("%#x\n", msg);
printf("%#x\n", &msg);
//函数指针
//函数返回值类型,函数指针的名称,函数的参数列表
int(fun_p)(char msg, char* title) = msg;
fun_p("消息内容","标题");
getchar();
}
//见图五效果图
//7.回调函数
int add(int a,int b) {
return a + b;
}
int minus(int a, int b) {
return a - b;
}
//msg 函数需要传递一个函数指针参数
//类似于我们 Java 中的回调函数
void msg(int(*func_p)(int a, int b),int m, int n) {
int r = func_p(m, n);
printf("%d\n",r);
}
void main() {
//加法
msg(add,55,45);
//减法
msg(minus,55,45);
getchar();
}
//见图六效果图
//用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址。
评论