指针的运算

来源:互联网 发布:森海塞尔淘宝哪家 编辑:程序博客网 时间:2024/06/06 00:11

赋值运算
p=&a; //将变量地址赋值给指针
p=array; //将数组地址赋值给指针
p=&array[i]; //将数组元素赋值给指针
p1=p2; // 将指针地址赋值给指针

# include <stdio.h>//引用函数库void main(){    int a = 10;//变量赋值,此时a变量的地址是&a    int *p1 = &a;//将a变量的地址赋值给p1    int *p2 = p1;//将p1的值赋值给p2    printf("%x %x %x",&a,p1,p2);    printf("\n%d %d %d",a,*p1,*p2);}f0889414 f0889414 f088941410 10 10

数组中的指针运算

# include <stdio.h>//引用函数库void main(){    int a[5] = {1,2,3,4,5};    printf("%x\n",a);//打印数组的首地址    for (int i = 0;i<5;i++){//下标循环        //打印数组元素的值        printf("%d,%d\n",a[i],*(a+i));//a是一个地址值,a+1表示地址值前进一个该类型大小的字节        //打印数组元素的地址        printf("%x,%x\n",&a[i],a+i);    }    for (int *p =a;p<a+5;p++){//指针循环        printf("\n%d,%x", *p,p);    }}

指针的自增和自减运算只有在数组中才有意义,因为数组中的元素类型是一定的,就是指针的+1前进的长度是一定的。
这也解释了为什么数组的类型是要求一致的
指针++就是按照一个指针类型的大小,前进一个类型的大小,如果是int就前进四个字节

指针与多维数组

# include <stdio.h>//引用函数库# include <stdlib.h>void main(){    int a[3][3] = {1,2,3,4,5,6,7,8,9};    printf("%x, %x, %x",&a,a,*a);//他们不是同一个指针虽然打印出来的首地址一样,但是长度不同    //&a是数组地址,长度4*9个字节,a是行地址,长度4*3字节,*a元素地址,长度4*1字节    printf("\n%d,%d,%d\n",sizeof(*&a),sizeof(*a),sizeof(**a));    for(int i =0;i<3;i++){        for(int j =0;j<3;j++){            printf("%d,%x ",a[i][j],&a[i][j]);        }        printf("\n");    }    printf("\n   %x    %x    %x",*a,*a+1,*a+2);//分别代表第0行的第一/二/三个元素,地址每次前进4*1个字节    printf("\n   %x    %x    %x",a,a+1,a+2);//分别代表第0行,第1行,第2行的地址,地址每次前进4*3个字节}e880cca0, e880cca0, e880cca036,12,41,e880cca0 2,e880cca4 3,e880cca8 4,e880ccac 5,e880ccb0 6,e880ccb4 7,e880ccb8 8,e880ccbc 9,e880ccc0    e880cca0    e880cca4    e880cca8   e880cca0    e880ccac    e880ccb8

a[i][j]=*(*(a+i)+j)
&a[i][j]=*(a+i)+j
a[i]=*(a+i)
&a[i]=a+i

原创粉丝点击