指针与内存

xiaoxiao2021-02-27  211

内存:

windows下双击某个可执行程序,发生了: 1.程序要进行的操作对应的代码被装载到代码区; 2.全局和静态数据等待装载到数据区; 3.开辟堆栈,供临时变量使用 内存中数据可以是操作,也可以是数据 变量是对程序中数据存储空间的抽象

void main(){ int a[5]={1,2,3,4,5}; printf("%x,%x",a,&a); //32位系统下 printf("\n%d,%d",sizeof(*a),sizeof(*(&a)));//4,20

*(&a):指向整个数组; int (*pa)[5]=&a; //指向数组的指针 int *p=a;//指向元素的指针 *a:指向的是第一个元素

指针与二维数组

在二维数组中,a &a a[0] &a[0] *a ,都是一样的值,解析方式不一样; 二维数组名是一个数组指针,即指向数组第一行数组首地址的指针,它实际上也是一种指针类型,类似于函数指针,如int (*prr)[3](括号不能省略,否则成为了指针数组。指针数组是数组类型,代表数组的每一个元素的指针类型 ,声明如下 int *prr[3])

int main(){ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; printf("%d,%d\n",a,*a); //1379961088,1379961088 printf("%d,%d\n",a[0],*(a+0)); //1379961088,1379961088 printf("%d,%d\n",&a[0],&a[0][0]); //1379961088,1379961088 printf("%d,%d\n",a[1],a+1); //1379961104,1379961104 printf("%d,%d\n",&a[1][0],*(a+1)+0); //1379961104,1379961104 printf("%d,%d\n",a[1][0],*(*(a+1)+0)); //9,9 printf("%d,%d\n",a[2],*(a+2)); //1379961120,1379961120 printf("%d,%d\n",&a[2],a+2); //1379961120,1379961120 printf("%d,%d\n",*a[2],*(*(a+2)+0)); //17,17 return 0; } a,&a,*a值都是相同的,都是数组的首地址;

在二维数组中: 如 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}

; 如printf(“\n%d,%d,%d\n”, sizeof(*a), sizeof(*(&a)), sizeof(**a));//16,48,4数组名a是个行指针,指向第一行;(有4个元素的数组)&a:是一个指向二维数组的指针*a是一个指向int类型的数据的指针;a+1行指针,指向第一行*a指向第一行第一个元素的指针*a+1指向第一行第二个元素的指针*a+2指向第一行第三个元素的指针*(a+1)指向第二行第一个元素*(a+1)+1指向第二行第二个元素*(a+1)+2指向第二行第三个元素a[i][j]*(*(a+i)+j)*(a+1)+2指向第二行第三个元素&a[i][j]*(a+i)+j*(a+i)+j指向第i行第j个元素的指针sizeof(* a) 此时a是个行指针sizeof(* *a) 此时*a是个列指针a[0] a[1] a[2]某一行第一列的地址 a[0]+1移动到该行下一列* a[0]*(a[0]+0)*(a[1]+2)a[1][2]*(*(a+1)+2)a[1][2]

一维数组中

int b[]={1,2,3,4}; printf("\n%d",((*b)+1)); //2 printf("\n%d\n",((*b)+2)); //3 printf("\n%d",(*(b+1))); //2 printf("\n%d",*(&(b[1]))); //2 b+i指向b[i]*b解引用一维数组得到值

一维数组和二维数组中, 二维数组实际上是个指针数组,二维数组**a(二次解引用)得到值,一维数组*a得到值

int iArr[2][3]={0,1,2,3,4,5}; int *p=iArr[0]; printf("%d\n",p[3]); //3 printf("%d\n",*(p+3)); //3 int **pp=iArr; //报错,无法从int[2][3]转换成int ** int (*pp2)[3]=iArr; //行指针 int *pp3=iArr[0]; //列指针 *(pp3+1); //移动到下一列(列指针一次解引用就可以取出值) pp2是一个整行,在指针上加减一个整数都是移动整行,而不是一个元素。比如说,pp2+1代表现在指针移动到下一行了,*(pp2+1)代表取到了这第二行数组,整行元素取到了,要取该行某个元素到话,那么*(pp2+1)+2指针指向了第二行第三个元素到地址,解引用取出来元素的值,*(*(pp2+1)+2)。
转载请注明原文地址: https://www.6miu.com/read-16791.html

最新回复(0)