指针 获取地址上的值 *p等于值 p等于地址
定义: 内存单元的编号 引用 在内存中
*的意思: 取这个地址上的数据 也叫间接运算符;
例如 *(&sum)等价于 sumint *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;
}
}