原文地址:https://www.cnblogs.com/liqinglucky/p/pointer.html
在计算机中,数据都是存放于内存单元中。每个内存单元就是数据的存放地址。这样存放地址就指向我们定义的变量,指针就是内存单元的地址。
#include<stdio.h> void main(void) { int *p1,a=1; void *p2; printf("a start address:%p\n",&a); printf("p1 start address:%p\n",p1); printf("p2 start address:%p\n",p2); p1=&a; p2=p1; printf("a end address:%p\n",&a); printf("p1 end address:%p\n",p1); printf("p2 end address:%p\n",p2); printf("value p1 pointed to:%d\n", *p1); printf("value p2 pointed to:%d\n", *((int *) p2)); }
这个程序中,a是变量,变量a的起始地址(即:0x7ffcf23af3ac)为a的指针。p1,p2是存放地址的变量,称为指针变量。如果将a的地址赋值给p1(p1=&a),那p1存放的就是变量a的地址。*p1表示对p1指向的地址存放内容取出的操作。
运行结果:
$ gcc -o an_example an_example.c $ ./an_example a start address:0x7ffcf23af3ac //每次运行出的地址是不同的 p1 start address:0x7ffcf23af4a0 p2 start address:(nil) a end address:0x7ffcf23af3ac p1 end address:0x7ffcf23af3ac p2 end address:0x7ffcf23af3ac value p1 pointed to:1
value p2 pointed to:1
结构体指针
#include<stdio.h> void main(void) { typedef struct { int *OK; int NO; }STATE; STATE *p1; STATE p2; int a=12; printf("p1 OK addr:%p\n",&p1->OK); printf("p1 NO addr:%p\n",&(p1->NO)); printf("p2 OK addr:%p\n",&p2.OK); printf("p2 NO addr:%p\n",&p2.NO); p2.OK=&a; p2.NO = 0;
printf("p2 OK=%d\n",*p2.OK); printf("p2 NO=%d\n",p2.NO); }
成员运算符"."和" ->"。区别是,直接引用:p2.成员名,(*p1).成员名,间接引用:p1->成员名。这三种用法是等价的。
运行结果
p1 OK addr:0x400440 p1 NO addr:0x400448 p2 OK addr:0x7ffcaefc12a0 p2 NO addr:0x7ffcaefc12a8 p2 OK=12 p2 NO=0
将指针传递
#include <stdio.h> #include <malloc.h> typedef struct STRC_def{ int i; int j; }STRC; int Func1(STRC * pSTRC); int Func2(STRC aSTRC); int main() { STRC * a =(STRC *)malloc(sizeof(STRC));//使用堆内存 STRC b;//使用栈内存 a->i=0;//初始化 a->j=0; b.i=0; b.j=0; Func1(a);//传递指针 Func2(b);//传递变量 printf("a: %d %d\nb: %d %d\n",a->i,a->j,b.i,b.j);//结果应该是 a: 1 2 \n b: 0 0 //因为传递指针使用的是同一个存储位置,而传递变量使用的是内容复制的存储位置 return 0; } int Func1(STRC * pSTRC) { pSTRC->i=1; pSTRC->j=2; return 0; } int Func2(STRC aSTRC) { aSTRC.i=3; aSTRC.j=4; return 0; }
运行结果
a: 1 2 b: 0 0
标签:p2,p1,OK,int,address,printf,指针 From: https://www.cnblogs.com/liqinglucky/p/pointer.html