c函数速查: https://pan.baidu.com/s/1sllYdul
通过几个例子 复习 二级指针 指针的运算 指针与数组 函数指针 练习
指针为什么要有类型
指针和地址的区别, 指针有类型 地址没有类型.
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <math.h>
#include <time.h>
//这是引用的头文件
举例: 1
// 1.指针为什么要有类型?
//指针有类型,地址没有类型
//地址只是开始的位置,类型读取到什么位置结束
void main(){
int i = 89;
//int 类型的指针
int *p = &i;
double j = 78.9;
//赋值为double类型变量的地址
p = &j;
printf("double size:%d\n", sizeof(double));
printf("%#x,%lf\n",p,*p); //想通过4字节读取8字节变量的值,是不行的
getchar();
}
2. NULL空指针 指针初始化
//2.NULL空指针 指针一般需要初始化 置空
void main(){
int i = 9;
int *p = NULL;
//p = &i;
//空指针的默认值为0
printf("%#x\n",p);
//访问内存地址0x000000操作系统不允许
//p = 100; //操作系统不允许访问
printf("%d\n",*p);
getchar();
}
3, 多级指针 使用
//3.多级指针(二级指针)
//指针保存的是变量的地址,保存的这个变量还可以是一个指针变量
//动态内存分配给二维数组
void main(){
int a = 50;
//p1上保存的a的地址
int* p1 = &a;
//p2上保存的p1的地址
int** p2 = &p1;
//int*** p3 = &p2;
printf("p1:%#x,p2:%#x\n",p1,p2);
**p2 = 90;
printf("%d\n",a);
getchar();
}
上面的例子 通过操作二级指针改变了 a 的值
个人理解 : 二级指针 可以理解成二维数组 三级指针可以理解成三位数组
一级指针是一条线 , 二级指针是一个面, 三级指针 是一个立方体 .
— 分割线 —
第4个例子 指针的运算
发现markdown > 操作不错
//4 指针的运算
void main(){
int ids[] = { 78, 90, 23, 65, 19 };
printf("%#x\n", ids);
printf("%#x\n", &ids);
printf("%#x\n", ids[0]);
//指针变量
int *p = ids;
printf("%d\n", *p);//默认打印第0个
//指针的加法
p++;
printf("p的值 %d\n", *p);
printf("16进制 %#x\n", *p);
getchar();
}
效果图
第五个例子 通过指针给数组赋值
//5 通过指针给数组赋值
void main(){
int uids[5];
//int i = 0;
//高级写法 现在的写法 这里没有操作指针 实际上内部操作了
/*for (i; i < 5; i++)
{
uids[i] = i;
}*/
//早些版本的写法 操作指针了
int* p = uids;
printf("%#x\n", p);
int i = 0; //i是数组元素的值
for (; p < uids + 5; p++){
*p = i;
i++;
}
int j = 0;
for (; j < 5; j++)
{
printf("数组 uids[%d] = %d \n", j, uids[j]);
}
getchar();
}
第六个例子 函数指针
函数指针1
int msg(char *msg, char *title){
messagebox(0, msg, title, 0);
return 0;
}
void main(){
//函数返回值类型,函数指针的名称,函数的参数列表
//函数指针 这是把一个函数赋给指针
int(*fun_p)(char *msg, char *title) = msg;
fun_p("内容", "title");
getchar();
}
函数指针2 例子
int add(int a, int b){
return a + b;
}
int minus(int a, int b){
return a - b;
}
void msg(int(*func_p)(int a, int b), int m, int n){
printf("执行一段代码...\n");
printf("执行回调函数...\n");
int r = func_p(m, n);
printf("执行结果:%d\n", r);
}
void main(){
//加法
//int(*func_p)(int a, int b) = add;//把这句 直接放到msg 作为参数穿进去了
msg(add, 3 , 5);
getchar();
}
运行结果
最后一个例子
//案例:用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来
int* getMinPointer(int ids[], int len){
int i = 0;
int *p = &ids[0];
for (; i < len; i++)
{
if (ids[i] < *p){
p = &ids[i];
}
}
return p;
}
void main(){
int ids[10];
int i = 0;
//初始化随机数发生器,设置种子,种子不一样,随机数才不一样
//当前时间作为种子 有符号 int -xx - > +xx
//看c语言速查表
srand((unsigned)time(NULL));
for (i; i < 10; i++)
{
//100范围内
ids[i] = rand() % 100;
printf("%d\n", ids[i]);
}
//调用
int* p = getMinPointer(ids, sizeof(ids) / sizeof(int));
printf("指针地址: %#x, 最小值: %d", p, *p);
getchar();
}
运行结果:
作者:liudao7994 发表于2017/7/31 17:27:39 原文链接
阅读:186 评论:0 查看评论