C语言 - 指针和数组的关系

 一、数组名、sizeof(数组名)、&数组名的关系

数组名  ——   一般指数组首元素的地址

sizeof( 数组名 )  ——   数组名表示整个数组,计算的是整个数组的大小

&数组名  ——   取出的是整个数组的地址,计算的是整个数组的大小

二、使用指针打印一维数组

1、首先,int *p = arr ;  这里的arr是数组的首元素地址,那么p + i 就是 arr [ 0 + i ]

2、由此可得,arr [ i ]   <==>   *( p + i )

3、那么就有了以下的打印方式

int main()
{
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int *p = arr;

    printf("1: %d \n", arr[2]);
    printf("2: %d \n", *(arr + 2));
    printf("3: %d \n", *(p + 2));
    printf("4: %d \n", *(2 + p));
    printf("5: %d \n", *(2 + arr));
    printf("6: %d \n", 2 [arr]);
    printf("7: %d \n", p[2]);
    printf("8: %d \n", 2[p]);
}

1、arr[2]  ——   直接打印下标为2的元素  —— 打印3

2、*( arr + 2 )   ——   arr为数组首元素的地址 ,+ 2 便指向了下标为2的元素  ——   打印3

3、*( p + 2 )   ——    p指向了arr的首元素地址,+ 2 便指向了下标为2的元素  ——   打印3

4、*( 2 + p )  ——   同理,p指向了arr首元素的地址,2 + p也是指向了下标为2的元素  ——  打印3

5、*( 2 + arr )  ——   arr为首元素地址,2 + arr则会跳到下标为2元素的地址,解引用之后  ——  打印3

6、2 [ arr ]  ——   与arr[ 2 ] 相同,会被转换成*( 2 + arr ),解引用之后  ——  打印3

7、p [ 2 ]  ——   会被转化为 *( p + 2 ), 解引用之后  ——  打印3

8、2 [ p ]  —— 同上

结论:以上打印方法完全相等.

三、使用指针打印二维数组

理解以上知识点之后,那么二维数组的打印就可以这样

int main()
{
    int arr[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};

    printf("%d\n", arr[1][1]);
    
    printf("%d\n", *(*(arr + 1) + 1));
}

1、*(*(arr + 1) + 1)   ——   首先,arr是数组第一行的地址 ,+1就跳过一行,指向第二行,解引用得到第二行第一个元素的地址,再+1得到第二行第二个元素的地址,解引用之后打印出7

结论:arr[ 1 ] [ 1 ]   <==>   * ( * ( arr + 1 ) + 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值