钟于 忠于 衷于 终于 2022-05-17 15:32 采纳率: 100%
浏览 24
已结题

c语言中的数组指针的疑问

问题遇到的现象和发生背景

既然*p是指向了数组的地址,打印为什么需要*(*p)呢?为什么*(*p)==(*p)[i]
(p)[i]可以理解,*(p)我不理解

问题相关代码,请勿粘贴截图

#include <stdio.h>
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &temp;
int i;

for(i = 0; i < 5; i++)
{
    printf("%d\n", *(*p + i));
    //或者 printf("%d\n", (*p)[i]);
 } 
 return 0;

}

望各位解答

  • 写回答

1条回答 默认 最新

  • bostonAlen 2022-05-17 15:44
    关注

    *(*p)就是取地址里面的内容

    int *p[5],首先它是一个数组,它的大小是5,它里面存放的数据类型是int *,也就是整型指针。 所以它叫指针数组、 (从右向左解析这个表示)
    int (*p)[5],首先p是一个指针,指向大小为5的数组,因此这叫数组指针。(括号优先)
    而 *p是指向了数组的首地址,所以 *p就是第一个元素temp[0]的地址,为&temp[0]或者temp ,再因为数组是连续的空间, *p+1就是&temp[1],而 *(*p+1)就是取地址里面的值

    你可以打印 printf("%d\n", (*p + i));出来看看,地址就是依次往后移动一个int的大小,也就是4个字节,int就是占4个字节
    同时也可以对比数组和指针的地址

    for(i = 0; i < 5; i++)
    {
        printf("%d\n", &temp[i]);
     } 
    for(i = 0; i < 5; i++)
    {
        printf("%d\n", (*p + i));
     } 
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月25日
  • 已采纳回答 5月17日
  • 创建了问题 5月17日