指针与内存

来源:互联网 发布:淘宝网店加盟代理 编辑:程序博客网 时间:2024/06/08 02:47

内存:

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]);     //3printf("%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)。
1 0
原创粉丝点击