【问题标题】:C pointers OutputC 指针输出
【发布时间】:2018-01-13 19:36:55
【问题描述】:

有人可以帮我理解为什么我会收到此输出吗? 我对第一个 printf 感到困惑:f[2]=3 第二个printf我没问题。 整个第三个 printf 让我感到困惑。

#include <stdio.h>
#include <stdlib.h>
#define DIM 8

int*func(int*,int);

int k = 10;

void main(void)
{
  int i;
  int k = 11;
  int f[DIM];
  int*p1 = f+1;
  int**p2 = &p1;
  int*p3;
  char* zf[]={"text0", "text1", "text2"};

  for(i=0; i<DIM; i++) 
    f[i] = i % DIM + 1;

  printf("a) i=%d, *f=%d, f[2]=%d, *(p1+5) =%d\n", i, *f, f[2], *(p1+5));
  printf("b) k=%d, zf[1]=%s, **zf=%s, **p2=%d\n", k, zf[1], *zf, **p2);

  p3 = func(f, k);
  p1 = p1 + 3;

  printf("c) k=%d, *p3=%d, f[7]=%c, *p1=%d\n", k, *p3, f[7], *p1);
}


int* func (int ff[])
{
   int* p4 = (int*) malloc (sizeof(int));
   *p4 = ff[3];
   k = k - 3;
   ff[k] = 65;
   return p4;
}

输出:

a) i=8, *f=1, f[2]=3, *(p1+5) = 7
b) k=11, zf[1]=text1, **zf=text0, **p2=2
c) k=11, *p3=4, f[7]=A, *p1=5

【问题讨论】:

  • Terribru - 一堆单字母 var 名称。

标签: c arrays function pointers output


【解决方案1】:

讨论了相关的:-

int*p1 = f+1;

f 衰减为指向第一个元素的指针 (int*)。 f+1 只不过是&amp;f[1]f[1] 的地址。请记住,指针算术使用它指向的任何类型的大小单位。这里+1 表示将sizeof(int) 添加到f

*f 在第一个 printf 中取消引用该指针(衰减指针)。因为它是指向第一个元素的指针,所以*ff[0]

p1+5 正在从f+1 移动5*sizeof int 字节,即&amp;f[6]。所以*(p1+5)f[6]

%c 打印 ASCII 值存储在f[7] 中的字符,在我们制作f[7]=65 的调用函数中,字符A 的ASCII 值是65

p1=p1+3 指向 f[4],其逻辑与以前相同 - 它打印 5,这就是原因。

动态分配的内存,其生命周期超出了函数的范围 - 您返回了它,并且打印了存储在那里的值。(*p3)。分配给分配内存的值是数组f 的索引3 处的元素。您已将其传递给函数func

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多