C语言sizeof函数和指针问题

时间:2023-01-29 18:50:30
下面这段代码中的sizeof和指针怎么分析?

#include <stdlib.h>

void test(){
int *l[4];
int (*q)[4];
printf("%d %d %d %d\n", sizeof(l), sizeof(*l), sizeof(q), sizeof(*q));
}

void main()
{
int a[3][4]={{1,2,3,4}};
int (*p)[4];
test();
p=a;
p[0]=a[1];
printf("%d\n", *(*p+3));
}

7 个解决方案

#1


sizeof(l) = 16; 整个数组长度
sizeof(*l) = 4;数组内第一个元素,指针
sizeof(q) = 4;指针
sizeof(*q) = 4;指针

*(*p+3) = 3 

#2


错了 
sizeof(*q) = 16;

#3


   p[0]=a[1]; //这个可以吗?
sizeof与编译器有关的
printf("%d %d %d %d\n", sizeof(l), sizeof(*l), sizeof(q), sizeof(*q));
32位:结果是16 4 4 16
64位(VS)32 8 8 16

#4


*(*p+3) = 4...犯困啊。。sizeof(*q)表示数组长度。

#5


(*p)[0]=a[0][1];

#6


上面把sizeof解释清楚了,我就试着分析下p[0] = a[1]的错误。

int (*p)[4];
p = a;
p[0] = a[1];               //因为p是指向数组的指针。p[0]也就是&a[0][0],它是右值,试图改变数
                               //组的地址,无法对它赋值。

#7


呵呵,说一下我自己的思路吧!
sizeof(l)中的l代表数组的首地址,那么输出的就是整个数组的大小,等于4*sizeof(int)

sizeof(*l)中的*l相当于*(&l[0]),那么实际上它就是l[0]的size

sizeof(q)中的q是一个二级指针(即指针的指针),所以说它等于一个指针的size(在32位系统下是32)

sizeof(*q)中的*q相当于一维数组int[4]的首地址,所以它输出的是整个一维数组的大小,等于4*sizeof(int)


关于p[0]=a[1];
这其实是错误的用法,虽然p是指针变量,p[0]也是指针,但是p[0]却是常指针,不能改变指向。

#1


sizeof(l) = 16; 整个数组长度
sizeof(*l) = 4;数组内第一个元素,指针
sizeof(q) = 4;指针
sizeof(*q) = 4;指针

*(*p+3) = 3 

#2


错了 
sizeof(*q) = 16;

#3


   p[0]=a[1]; //这个可以吗?
sizeof与编译器有关的
printf("%d %d %d %d\n", sizeof(l), sizeof(*l), sizeof(q), sizeof(*q));
32位:结果是16 4 4 16
64位(VS)32 8 8 16

#4


*(*p+3) = 4...犯困啊。。sizeof(*q)表示数组长度。

#5


(*p)[0]=a[0][1];

#6


上面把sizeof解释清楚了,我就试着分析下p[0] = a[1]的错误。

int (*p)[4];
p = a;
p[0] = a[1];               //因为p是指向数组的指针。p[0]也就是&a[0][0],它是右值,试图改变数
                               //组的地址,无法对它赋值。

#7


呵呵,说一下我自己的思路吧!
sizeof(l)中的l代表数组的首地址,那么输出的就是整个数组的大小,等于4*sizeof(int)

sizeof(*l)中的*l相当于*(&l[0]),那么实际上它就是l[0]的size

sizeof(q)中的q是一个二级指针(即指针的指针),所以说它等于一个指针的size(在32位系统下是32)

sizeof(*q)中的*q相当于一维数组int[4]的首地址,所以它输出的是整个一维数组的大小,等于4*sizeof(int)


关于p[0]=a[1];
这其实是错误的用法,虽然p是指针变量,p[0]也是指针,但是p[0]却是常指针,不能改变指向。