int a=10;
int *p=&a;
int **p1=&p (&+变量名而不是指针 ) (嵌套的) //打印得到的值是*p的值,打印得到的三个值都一样
printf("a=%p\n",&a);
printf("*p=%p\n",p); p是地址 *p是取地址上的值
printf("**p1=%p\n",&p); &p是地址(这是两个地址) 一颗*就有一个地址
打印得到的地址都不一样
参数传递传递的都是地址(实参),,形参可以用来定义变量
定义指针的类型应该和变量的类型一致
个人总结:三个量 一个变量a ,一个指针,一个指向指针的指针
int *p=&a; 指针p原本有一个地址,同时又取到了a的地址还有值,存储在自己原本的地址中
int **p1=&p; 同样的指向指针p的指针*p1原本也有一个地址,获取得到指针p的地址,但是没有得到变量的地址,
却可以通过p的地址获取变量a的值
指针的运算
1:指针变量的赋值运算
与数组的关系,将首地址赋值给指针
*p++ 对应数组的下标变化
结论: *(P+n)=a[n];
数组的下标取值 指针的地址取值
2:通过指针引用多维数组 二维数组首地址 a[0][0] 简称a[0]
行指针 a代表第0行首地址 a+1代表第1行首地址 a+i
列指针 a[0] a[0]+1 a[0]+2 a[0]+j
a[i][j] 表示的是 第i+1行 第j+1列 上对应的数值
总结;二维数组与指针的关系
printf("%d\n",*(a[i]+j));
一维数组中 a[i]=*(a+i)
公式 a[i][j]=a[i]+j=*(*(a+i)+j);
这些公式都是在二维数组中运用的,不单独使用
//指针与一维数组的关系
#include<stdio.h>
void main(){
int a[5]={1,2,3,4,5};
int i;
int *p;
p=a; //p=&a[0]
for( i=0;i<5;i++){
printf("%d\n",a[i]);
printf("%d\n",*(p+i)); 达到的效果是一样的 结论*(p+i)=a[i]
}
getchar();
}
#include<stdio.h>
void main(){
int *p1,*p2;
int value=10;
p1=&value;
value+=10;
p2=&value;
if(p1==p2){
printf("这两个指针的地址一样");
}
else{
printf("这两个指针的地址不一样");
}
getchar();
}
//指针与二维数组的关系
#include<stdio.h>
void main(){
int i,j;
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d",a[i][j]);
printf("%d\n",*(a[i]+j)); 得到的结果是一样的,结论:a[i][j]=a[i]+j;
}
}
getchar();
}
推理:行指针 a代表第0行首地址 a+1代表第1行首地址 a+i 往下走 可以写成a[i]
列指针 a[0] a[0]+1 a[0]+2 a[0]+j 往右走
然后结合一起得到 a[i]+j 也可以写成 *(*(a+i)+j) 运行发现等价于a[i][j]
//二维数组与指针的关系
//打印得到的是地址 a[2]是一个数组 a+2=a[2]
#include<stdio.h>
void main(){
int i,j;
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
printf("%d,%d\n",&a[2],a+2); //得到的是9这个元素的地址(三行一列)
printf("%d,%d\n",a[2],*(a+2)); //得到的是9这个元素的地址(三行一列)
printf("%d,%d\n",*a[2],*(*(a+2)+0)); //9,9 得到9这个元素 *后面跟的一定是地址,得到的结果是一个值
printf("%d,%d\n",a[1],a+1); //得到的是5这个元素的地址(二行一列)
printf("%d,%d\n",&a[1][0],*(a+1)+0); //得到的是5这个元素的地址(二行一列)
printf("%d,%d\n",a[1][0],*(*(a+1)+0)); //5,5 得到5这个元素 确定了具体位置,所以得到的结果是一个值
printf("%d,%d\n",&a[0],&a[0][0]); //得到的是1这个元素的地址(一行一列)
printf("%d,%d\n",a[0],*(a+0)); //得到的是1这个元素的地址(一行一列)
for(i=0;i<3;i++){
for(j=0;j<4;j++){
//printf("%d",&a[i][j]);
printf("%d\n",a[i]+j); //打印得到二维数组每个元素的地址, 用于上面的对比
}
}
getchar();
}
课堂小游戏
//小外挂
#include<stdio.h>
#include<Windows.h>
void main(){
int Hp=100;
double Exp=100000;
printf("%x,%x\n",&Hp,&Exp); 打印地址
while(1){
printf("我还有%d血",Hp);
printf("还剩余%f经验升级\n",Exp);
Sleep(1000); 每秒进行一次
}
getchar();
}
#include<stdio.h>
_declspec(dllexport) abc(){
int *p=(int *)0x34fbec; 输入的是上一步得到的地址
double *p1=(double *)0x3fbe4;
*p=1000;
*p1=10000000;
}
//创建两个项目,分别放入,生成解决方案,并且用上打针工具,注入插件和执行函数,运行即可;