本文共 4003 字,大约阅读时间需要 13 分钟。
指针是一个值为内存地址的变量。
变量是一块内存空间,指针是变量,是用来存储内存地址的变量。
#include#include int main(){ int num = 9; printf("num变量的地址为:%p\n",&num); // p表示指针占位符 return 0;}
#include#include int main(){ int num = 9; int * ptr_num = # printf("num变量的地址为:%p\n",ptr_num); // p表示指针占位符 return 0;}
根据地址,找到空间!然后操作空间!
变量地址也占用空间,只不过占用的不是内存空间,而是寄存器的存储空间。
内存地址实际上是一种偏移量,存储于段寄存器中。内存地址只是一种抽象,不是真正的物理内存地址,而是逻辑地址。由逻辑地址寻找到物理地址需要经过 逻辑地址->线性地址->物理地址 转换过程,而这些过程都是基于寄存器完成的。
#include#include int main(){ int num = 9; int * ptr_num = # * ptr_num = 10; printf("* ptr_num的值为:%d\n",* ptr_num); printf("num的值为:%d\n",num); // p表示指针占位符 return 0;}
指针的类型,跟他所指向的数据结构有关。
基本类型的指针指向基本类型的数据结构。 比如:char * p; int p; float p; double *p;分别指向的是char, int ,float, double 类型的变量。#include#include int main(){ int num1 = 1024; int num2 = 2048; int * ptr1; int * ptr2; ptr1 = &num1; ptr2 = &num2; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 将变量1的值赋给变量2 num2 = num1; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); *ptr2 = *ptr1; // 等价于 num2 = num1 printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 地址变了,num1,num2不受影响 ptr2 = ptr1; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); return 0;}
一个变量就是一个内存空间,内存一定是有物理地址的!指针就是保存变量内存物理地址的变量!
数组是一个连续的内存空间,数组名就是它的首地址。
#include#include int main(){ double score[] = { 98,87,65,43,76}; printf("数组的首地址:%p\t 数组手元素的地址 :%p\n",score,&score[0]);}
数组名就是数组元素的首地址。
#include#include int main(){ int i; double score[5] = { 98,87,65,43,76}; double * ptr_score; ptr_score = score; for (i=0;i<5;i++) { printf("%.2lf\n",*ptr_score++); // 通过首地址取找数组元素的值 } for (i=0;i<5;i++) { printf("%.2lf\n",score[i]); }}
等价的!double类型的数据,每个数据移动了8个字节。物理地址是一个十六进制的数字。
#include#include int main(){ int array[] = { 15,20,25,30,35}; int i; int * ptr_array = array; for (i = 0;i<5;i++) { printf("第%d个元素的值为%d,地址为%p\n",i,*ptr_array,ptr_array); ptr_array ++ ; } /* 第0个元素的值为15,地址为0028FF0C 第1个元素的值为20,地址为0028FF10 第2个元素的值为25,地址为0028FF14 第3个元素的值为30,地址为0028FF18 第4个元素的值为35,地址为0028FF1C */ return 0;}
int型地址间隔4个字节。
#include#include #include #define N 7int main(){ int array[N] = { 15,20,25,30,35,40,90}; int i; int temp; // 实现数组的逆序 // 数组的首尾元素进行交换 for (i = 0;i
逆序数组,找规律是写程序必备的技能!
#include#include #include #define N 7int main(){ int array[N] = { 15,20,25,30,35,40,90}; int i; int temp; int * ptr_head; int * ptr_foot; ptr_head = &array[0]; ptr_foot = &array[N-1]; // 实现数组的逆序 // 数组的首尾元素进行交换 for (i = 0;i
指针实现数组逆序!
二维数组与指针
首地址
&a[0][0]
有祥有略!有精有简!有的放矢有的取舍去学习!
何为二维数组,如何理解?由n个一维数组组成!
#include#include #include int main(){ int i,j; double score[5][3] = { { 55,56,57}, { 58,59,60}, { 61,62,63}, { 64,65,66}, { 67,68,69} }; // 传统的访问方式 for (i = 0;i < 5;i++) { for (j = 0;j <3 ;j++) { printf("%.2lf\t",score[i][j]); } printf("\n"); } printf("=================================\n"); // 指针的方式访问 for (i = 0;i < 5;i++) { for (j = 0;j <3 ;j++) { // printf("%.2lf\t",*(score[i] + j)); printf("%.2lf\t",*(*(score+i) + j)); } printf("\n"); } return 0;}
*(*(score + i) + j) 获取二维数组的公式!
本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/8025510.html,如需转载请自行联系原作者