国嵌 答疑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)  得到的是一个指针