#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include<math.h>
//指针和地址的区别 : 指针有类型 地址没有类型
//1
/*void main(){
int i = 89;
//int 类型的指针
int *p = &i;
double j = 78.9;
//赋值为double类型变量的地址
p = &j;
printf("%#x,%lf\n", p,*p);
system("pause");
}
*/
//2 NULL 空指针
/*
void main(){
int i = 9;
int *p;
p = &i; //指针定义以后一定要赋值(初始化) 否则会报错 eg: 注释本行代码就会报错
//int *p = NULL; 空指针的默认值为0,访问内存地址0x000000十六进制的0 操作系统不允许
printf("%d\n", *p);
system("pause");
}
*/
//3 多级指针(二级指针)
//多级指针保存的是变量的地址,保存的这个变量还可以是一个指针变量
//eg 动态内存分配给二维数组
/*void main(){
int a = 50;
int* p1 = &a;
int** p2 = &p1;
printf("p1:%#x\n,p2:%#x\n",p1,p2);
**p2 = 90;
printf("%d\n",a);
system("pause");
}
*/
//3 指针的运算
//指针的运算,一般在数组遍历时才有意义,基于数组在内存中线性排列
/*
void main(){
//数组在内存中存储连续
int ids[] = { 78, 90,23,65,19 };
//数组变量名:ids就是数组的首地址
printf("%#x\n", ids);
printf("%#x\n", &ids);
printf("%#x\n", ids[0]);
//指针变量
int *p = ids;
p++; //p++ 向前移动sizeof(数据类型)个字节
p = p + 2;
p--;
printf("%d\n", *p);
getchar();
}
*/
//4通过指针给数组赋值
/*
void main(){
int uids[5];
// 高级写法
//int i = 0;
// for(; i < 5;i++ ){
// uids[i] = i;
//}
//早期版本写法
int* p = uids;
printf("%#x\n",p);
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();
//函数指针
//函数返回值类型,函数指针名,函数的参数列表
int(*fun_p)(char* msg , char* title) = msg;
fun_p("你吃过饭了吗?", "问候语");
getchar();
}
*/
/*
//对应指针int (*fun_p)(int a,int b)
int add(int a ,int b){
return a + b;
}
//对应指针 int (*fun_p)(int a,int b)
int minus(int a , int b){
return a - b;
}
//msg 函数需要传递一个函数指针参数 //java 中传递一个对象通过对象再调方法,c直接传递方法指针操作方法
void msg(int (*fun_p)(int a,int b),int m, int n){
printf("执行一段代码,给m+2...\n");
m = m + 2;
printf("执行一个传入的函数");
int r = fun_p(m, n);
// MessageBox(0,"消息","标题",0);
printf("执行结果 : %d\n",r);
}
void main(){
msg(add,10,20);
msg(minus, 50, 30);
getchar();
}
*/
//案例 : 用随机数生成一个数组,写一个函数查找最小的值, 并返回最小值的地址,在主函数中打印出来
//获取最小值的地址(指针)
int* getMinPointer(int uids[], int len){
int i = 0;
int *p = &uids[0];
for (; i < len; i++){
if (uids[i]<*p){
p = &uids[i];
}
}
return p;
}
void main(){
int uids[10];
int i = 0;
//初始化随机数发生器,设置种子,种子不同随机数才会不同
srand(time((unsigned)NULL)); //当前时间作为种子 有符号 int -xx --> +xx
for (; i < 10; i++){
uids[i] = rand()%100;
printf("%d\n", uids[i]%100);//%100表示获取100以内的随机数
}
int*p = getMinPointer(uids, sizeof(uids) / sizeof(int));
printf("%#x,%d\n",p,*p);
getchar();
}
#include <stdlib.h>
#include <Windows.h>
#include<math.h>
#include<time.h>
理解指针的含义个人认为一定要看懂指针是如何定义的:
int a = 20; int *p = a; p=&a; 理解这几个等式,就明白各自的意义和值了;
//指针和地址的区别 : 指针有类型 地址没有类型
//1
/*void main(){
int i = 89;
//int 类型的指针
int *p = &i;
double j = 78.9;
//赋值为double类型变量的地址
p = &j;
printf("%#x,%lf\n", p,*p);
system("pause");
}
*/
//2 NULL 空指针
/*
void main(){
int i = 9;
int *p;
p = &i; //指针定义以后一定要赋值(初始化) 否则会报错 eg: 注释本行代码就会报错
//int *p = NULL; 空指针的默认值为0,访问内存地址0x000000十六进制的0 操作系统不允许
printf("%d\n", *p);
system("pause");
}
*/
//3 多级指针(二级指针)
//多级指针保存的是变量的地址,保存的这个变量还可以是一个指针变量
//eg 动态内存分配给二维数组
/*void main(){
int a = 50;
int* p1 = &a;
int** p2 = &p1;
printf("p1:%#x\n,p2:%#x\n",p1,p2);
**p2 = 90;
printf("%d\n",a);
system("pause");
}
*/
//3 指针的运算
//指针的运算,一般在数组遍历时才有意义,基于数组在内存中线性排列
/*
void main(){
//数组在内存中存储连续
int ids[] = { 78, 90,23,65,19 };
//数组变量名:ids就是数组的首地址
printf("%#x\n", ids);
printf("%#x\n", &ids);
printf("%#x\n", ids[0]);
//指针变量
int *p = ids;
p++; //p++ 向前移动sizeof(数据类型)个字节
p = p + 2;
p--;
printf("%d\n", *p);
getchar();
}
*/
//4通过指针给数组赋值
/*
void main(){
int uids[5];
// 高级写法
//int i = 0;
// for(; i < 5;i++ ){
// uids[i] = i;
//}
//早期版本写法
int* p = uids;
printf("%#x\n",p);
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();
//函数指针
//函数返回值类型,函数指针名,函数的参数列表
int(*fun_p)(char* msg , char* title) = msg;
fun_p("你吃过饭了吗?", "问候语");
getchar();
}
*/
/*
//对应指针int (*fun_p)(int a,int b)
int add(int a ,int b){
return a + b;
}
//对应指针 int (*fun_p)(int a,int b)
int minus(int a , int b){
return a - b;
}
//msg 函数需要传递一个函数指针参数 //java 中传递一个对象通过对象再调方法,c直接传递方法指针操作方法
void msg(int (*fun_p)(int a,int b),int m, int n){
printf("执行一段代码,给m+2...\n");
m = m + 2;
printf("执行一个传入的函数");
int r = fun_p(m, n);
// MessageBox(0,"消息","标题",0);
printf("执行结果 : %d\n",r);
}
void main(){
msg(add,10,20);
msg(minus, 50, 30);
getchar();
}
*/
//案例 : 用随机数生成一个数组,写一个函数查找最小的值, 并返回最小值的地址,在主函数中打印出来
//获取最小值的地址(指针)
int* getMinPointer(int uids[], int len){
int i = 0;
int *p = &uids[0];
for (; i < len; i++){
if (uids[i]<*p){
p = &uids[i];
}
}
return p;
}
void main(){
int uids[10];
int i = 0;
//初始化随机数发生器,设置种子,种子不同随机数才会不同
srand(time((unsigned)NULL)); //当前时间作为种子 有符号 int -xx --> +xx
for (; i < 10; i++){
uids[i] = rand()%100;
printf("%d\n", uids[i]%100);//%100表示获取100以内的随机数
}
int*p = getMinPointer(uids, sizeof(uids) / sizeof(int));
printf("%#x,%d\n",p,*p);
getchar();
}