指向指针的指针,指针的运算,指针与多维数组的关系

来源:互联网 发布:淘宝汽车服务 编辑:程序博客网 时间:2024/06/04 17:10
指向指针的指针    一颗*就有一个地址  int *p=&a     int **p1=&p (变量的地址上的数值的地址)     
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;
}
//创建两个项目,分别放入,生成解决方案,并且用上打针工具,注入插件和执行函数,运行即可;























1 0
原创粉丝点击