重点指针

指针  获取地址上的值     *p等于值      p等于地址

定义: 内存单元的编号         引用 在内存中


*的意思: 取这个地址上的数据  也叫间接运算符;

例如 *(&sum)等价于 sum

int *p=0等价于int *p=Null;  指针变量值为零也就是空指针,


 定义指针:类型 *变量名=Null(空)

 例如 int *p=Null;

 int *p=&sum    取的是地址内存中的值

 或者int *p= (int*)一个地址   然后 在后面赋值完成操作


 *p的定义,取内存 然后对*p赋值,就可以完成对变量的赋值    (间接取值的方式)

 p就是存储取到的值    *指针符号  取地址还有对应的值

 int *p=&a   *p=100   传递指针 int add(*p)


指针与指针的减法;
int a[10],*p1,*p2;
p1=a;
p2=&a[5];
printf("%d",p2-p1);  // 得到的结果是5,看两个指针地址的距离

 

注意:

 *p++  意思就是获取的地址加一,在内存中显示地址会发现多了四个字节 ,因为它是int类型

 如果是double类型 则加八个字节

int a[3]={1};     a++  这是错误的   误以为数组的首地址左右移动,要移动应该是利用指针p++来实现

 
结论: 一维数组中 *(p+n)= a[n];
 

 函数也是有地址的,获取地址printf("%d",main);


常见问题

 
  如果显示*p未初始化这个问题,可以强行开辟一个内存给它用
 例如:int c=0;

     int *p=&c;



变量交换中应该格外注意的几点

 

 1:实参传的是值的话,交换也不会打到目的  ,传递的应该是地址  p1,p2


 2:在不同函数中,换地址的时候,对应的数值是不会交换的   ,交换的应该是数值*p       在相同的函数则可以进行地址交换也可以达到目的;


 3:只有对应的数值发生交换或者改变,对应的值和地址都会发生改变


 输出的也应该是交换后的值;

 

 指针变量作为参数传递,地址传递;


/*#include<stdio.h>
#include<stdlib.h>
void main(){
int a=10;
int *p=&a;
printf("%p\n",p);          //%p用来获取地址
printf("%x\n",&a);
getchar();
}*/

/*void swap(int *p1,int *p2){
int c=0;
int *p=&c;                       //因为老是报错未初始化,主要是那些内存系统在使用,所以强行开辟一个内存给*p使用
*p=*p1;                 //传值
*p1=*p2;                         //不同的函数,交换过程必须是对应数值,不可以是地址。
*p2=*p;
}


#include<stdio.h>
#include<stdlib.h>
void main(){
int a,b;
int *p1,*p2;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b){
swap(p1,p2);            //传递的是地址p1,p2,而不是数值*p1,*p2
}
printf("%d,%d",a,b);
system("pause");
}*/

/*#include<stdio.h>
#include<stdlib.h>
void main(){
int *p1,*p2,*p,a,b;
scanf("%d ,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b){
p=p1;
p1=p2;               //数值交换过程 ,在同一个函数中,地址的改变也可以改变数值
p2=p;
}
printf("max=%d,min=%d\n",*p1,*p2);         //*p1 , *p2表示的是对应的数值
system("pause");                 //得到的结果如果不是自己想要的,可能会出现几百万那种数,可以在运行结果页面切换成英文输入法得到结果
}*/


一维数组的结论:*(p+n)=a[n]


#include<stdio.h>
void main(){
int a[2][3]={{1,2,3},{4,5,6}};
int i,j;
int *p=&a[0][0];
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("%d\n",a[i][j]);            按顺序依次打印二维数组的每一个元素
printf("*p=%p\n",*p++);      

                                                                                                 注意:

                                                                                                *p++  意思就是获取的地址加一,在内存中显示地址会发现多了四个字节 ,因为它是int类型
                                                                                                              如果是double类型 则加八个字

}
}
getchar();
}

#include<stdio.h>
#include<Windows.h>
void main(){
int time=300;
printf("%x",&time);
while(1){
printf("剩余时间%d\n",--time);
Sleep(1000);                               以每秒减一的速度从三百开始减
}
getchar();
}

#include<stdio.h>
_declspec(dllexport)   add(){
int *p=(int *)3cfe20;                           获取time的地址,从而改变赋值
*p=50;                                       通过改变内存地址来改变数据,改为从五十开始减
}


上次未解决的问题:函数的递归调用

 输入一个数字,得到它的阶乘

#include<stdio.h>                            //调用头文件stdio.h
void main(){
int add(int n);
int n;
printf("请输入一个数");
scanf_s("%d",&n);
add(n);
printf("%d",add(n));
getchar();
getchar();
}




int add(int n){
if(n==1){
return 1; 
}
else{
return add(n-1)*n;
}
}














 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值