C指针输出

C指针输出,c,arrays,function,pointers,output,C,Arrays,Function,Pointers,Output,有人能帮我理解为什么我会收到这个输出吗? 我对第一个printf:f[2]=3感到困惑 第二次打印我没有问题。 第三张照片让我很困惑 #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 =

有人能帮我理解为什么我会收到这个输出吗? 我对第一个printf:f[2]=3感到困惑 第二次打印我没有问题。 第三张照片让我很困惑

#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;
}

讨论了相关问题:-

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

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

p1+5
正在从
f+1
移动
5*sizeof int
字节,即
&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

Terribru-一堆单字母变量名。