C 指针输出



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

#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) =%dn", i, *f, f[2], *(p1+5));
printf("b) k=%d, zf[1]=%s, **zf=%s, **p2=%dn", k, zf[1], *zf, **p2);
p3 = func(f, k);
p1 = p1 + 3;
printf("c) k=%d, *p3=%d, f[7]=%c, *p1=%dn", 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

讨论了相关的:-

int*p1 = f+1;

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

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

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

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

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

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

最新更新