Sizeof问题
S:
int *p = NULL;
sizeof(p)的值是多少? //4
sizeof(*p)呢? //4
int a[100];
sizeof (a) 的值是多少? //400
sizeof(a[100])呢?//请尤其注意本例。 //4 若是char a[100] 则为1
sizeof(&a)呢? //VC 下为400 linux下为4
sizeof(&a[0])呢? //4
int b[100];
void fun(int b[100])
{
sizeof(b);// sizeof (b) 的值是多少? //4 传入的是b数组的首地址
}
sizeof(NULL) = 4 0地址也是地址
printf("%x",a); 输出数组a的地址
printf("%x",&a)同样输出数组a的地址
printf("%x",a+1) 数组a的首地址+4
printf("%x",&a+1) 加整个数组a地址 +100*4
sizeof(&a+1) = 4 虽然是指向一个内存未定义的地址,但本质还是一个指针,占4字节
声明的不同
T:
现在我来提问了 大家看看下面两个声明 有什么不同 为什么
char *a[2]={"abcd","ABCD"}; (数组里有2个元素,每个元素是char型指针 指针数组)
char a[2][5] = {"abcd","ABCD"};
答案:
第一个是一维数组占用8个字节 每个指针指向只读存储区中的字符串
第二个是二维数组占用10个直接,里面的字符串直接存储在这个数组中
结构体的偏移
typedef struct _stu{
int a;
char b;
}STU;
STU a,*s;
s = &a;
printf("%p\n",&((struct _stu *)NULL)->b); //%p输出指针的值,即地址
以上表达式有没有问题?如果没有,输出是多少? 输出4(NULL地址为0,只是假想0地址处有个STU数据结构)
答案:没有问题
解析:公式总结:p->member的地址 = 指针p的地址 + member在类型(type)中的偏移量
如果没有预编译指令#pragma pack(1), 那么编译器在编译的时候会按默认对齐方式对齐,即以结构体成员中最大的类型成员来对齐。
typedef struct _stu\
{
char a;
double b;
int c;
}stu; sizeof(stu) = 24;8字节对齐
以下说明:(int)将十六进制地址强制类型转换为十进制 指针pd地址为0 e-s即为变量i在结构体中偏移量
数组与指针问题
设有以下定义:
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a, * p=a[0];
则下列能够正确表示数组元素a[1][2]的表达式是
A)*((* prt + 1)[2]))
B)*(*(p+5)) //P = a[0] p+1 = a[1] .....
C)(* prt + 1)+2
D)*(*(a+1)+2)
答案:这个问题 很显然 根据指针运算 D 是正确的,而 A) 我觉得没有办法变形过去 B) p是一级指针 不能这么用 C) 得到的是一个指针