#include
#include
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
%p是指针的值的意思
结果看 var和p的值虽然一样,但是两个变量是指向两个内存地址。
那如果改变var变量的值
#include
#include
int main(){
SetConsoleOutputCP(65001);
int var=20;
int p=var;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",p);
printf("%p\n",&var);
printf("%p\n",&p);
return 0;
}
可以看到var的值变了,p的值没变 而且两个变量的内存地址也不变,也就是说这只是一个简单的改变值得过程,如果你要想变量p根据var值变化而变化,那p就要指向var的内存地址
如下,看下下面的的代码理解下
#include
#include
int main(){
SetConsoleOutputCP(65001);
int var=20;
int *p;
p=&var;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
printf("-------\n");
var=11;
printf("%d\n",var);
printf("%d\n",*p);
printf("%p\n",&var);
printf("%p\n",p);
return 0;
}
var 是( 值 | 地址 ) 就是 ( 20 | &var)
*p是指针变量,指向 var的地址,相对于var 以p来表达就是( *p | p)就是( 值 | 地址 )
#include
#include
int main(){
SetConsoleOutputCP(65001);
int var[]={10,100,200};
int *ptr;
ptr=&var[0];// 也可以是ptr=var
for(int i=0;i<3;i++){
printf("var[%d]值:%d\n",i,*ptr);
printf("var[%d]地址:%p\n",i,ptr);
ptr++;
}
return 0;
}
#include
#include
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int var[MAX]={10,100,200};
int *ptr[MAX];
for(int i=MAX-1;i>=0;i--){
ptr[i]=&var[i];
printf("%d\n",*ptr[i]);
}
return 0;
}
#include
#include
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
char *name[]={
"小白",
"小红",
"小明"
};
for(int i=MAX-1;i>=0;i--){
// printf("%s\n",name[i]);
puts(name[i]);
}
}
#include
#include
#define MAX 3
int main(){
SetConsoleOutputCP(65001);
int a=1;
int *b,**c;
b=&a;
c=&b;
printf("%d\n",a);
printf("%d\n",*b);
printf("%d\n",**c);
printf("%p\n",&a);
printf("%p\n",b);
printf("%p\n",c);
}
指针作为参数的函数
#include
#include
void countFun(int *s){
*s=1;
}
int main(){
SetConsoleOutputCP(65001);
int size=0;
countFun(&size);
printf("%d",size);
}