国嵌 答疑2
来源:互联网 发布:数据库故障应急预案 编辑:程序博客网 时间:2024/05/01 15:43
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) 得到的是一个指针
- 国嵌 答疑2
- [Java] 作业2答疑
- 答疑
- 2009年2月份答疑帖
- UML2答疑
- HttpHandler答疑
- 答疑时间
- vicidial答疑
- 关于答疑
- 面试答疑
- 字符串答疑
- 知识答疑
- R答疑
- 题目答疑
- Scanner答疑
- 2B青年答疑:什么是2B青年?如何脱离2B青年行列?
- 传智播客JDBC_答疑学员提出的单例问题 2 知识点:单例模式
- [future]不能干一辈子开发?(续)——Leo网上答疑38-2
- 初学spring:web应用程序中使用Spring
- 移动web app开发必备
- C++语言复习-命名空间
- 策略模式
- Android 4.0 ICS SystemUI浅析——StatusBar加载流程分析
- 国嵌 答疑2
- 如何使用git为开源社区贡献力量
- Windows网络编程基本概念
- switch
- 用opengl画一个棋盘格,复制和缩放
- Android 4.0 ICS SystemUI浅析——StatusBar加载流程之Notification
- 《算法导论》15-3:编辑距离
- Android 4.0 ICS SystemUI浅析——StatusBar工作流程之时间日期设置
- 揭开Html 标签的面纱,忘不了的html .