#include
int main() {int a = 10;// 通过变量名访问内容 printf("a = %d\n",a);// 访问变量地址printf("address:0x%p\n",&a);// 通过地址访问内容;*:表示读取内存中的数据 printf("a = %d\n",*(&a));return 0;
}
指针变量就是存放别人地址的变量
#include
int main() {int a = 10;// 定义指针变量 int *p = &a;printf("a的地址:0x%p\n",&a);printf("p的地址:0x%p\n",p);printf("p的内容:%d\n",*p); // 通过地址取内容 return 0;
}
p1/p2的地址都相同,因为类型不同,造成指针的偏移量也不同
int类型偏移4个字节,char类型偏移1个字节
#include
int main() {int a;int *p1 = &a;char *p2 = &a;printf("p1的地址:%p\n",p1);printf("p1偏移后的地址:%p\n",++p1);printf("p2的地址:%p\n",p2);printf("p2偏移后的地址:%p\n",++p2);return 0;
}
功能性函数(changeData)修改指针变量数据,主函数(main)中也会随之发生改变
#include
void changeData(int *p1,int *p2){int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp;
}int main() {int data1 = 10;int data2 = 20;printf("数据交换前:%d %d\n",data1,data2);changeData(&data1,&data2);printf("数据交换后:%d %d\n",data1,data2);return 0;
}
#include
int main() {volatile unsigned int *p = (volatile unsigned int*) 0x000000000062FE1B;printf("p的固定地址:0x%p\n",p);return 0;
}
#include
int main() {int i;int a[5] = {1,2,3,4,5};int *p;p = &a[0]; // 把a[0]的地址赋值给指针p// p = a; 与上行等价:数组首元素地址for(i=0;i<5;i++){printf("%d ",*p++);// *p++:偏移的是一个int型的大小}return 0;
}
第一种:数组地址先偏移,再取内容
第二种:获取指针下标取内容
#include
int main() {int i;int a[5] = {1,2,3,4,5};int *p;p = a;for(i=0;i<5;i++){// 数组地址先偏移,再取内容 printf("%d ",*(a+i)); }putchar('\n');for(i=0;i<5;i++){// 获取指针下标取内容 printf("%d ",p[i]);}putchar('\n');/** 注意:程序报错!!! 原因:通过数组名的方式“++”,导致地址偏移过度数组名是常量指针a++偏移的是整个数组的大小 for(i=0;i<5;i++){printf("%d ",*(a++));}*/return 0;
}
#include
void initArr(int *p,int len){int i;for(i=0;iprintf("请输入第%d个数据:",i+1);scanf("%d",p++);}
}void printArr1(int *p,int len){int i;for(i=0;iprintf("%d ",*p++);}
}void printArr2(int *p,int len){int i;p+=len-1; // 将地址偏移到数组末尾for(i=0;iprintf("%d ",*p--);}
}int main() {int arr[5];int size = sizeof(arr) / sizeof(int);initArr(arr,size); // 初始化数组printArr1(arr,size); // 正序遍历printArr2(arr,size); // 逆序遍历return 0;
}
下一篇:【软件设计】常见限流排队业务设计