6) 柔性数组
#include
#include
structstudent
{
intid;
charsex;
inta[];
};
intmain()
{
inti = 0;
structstudent a;
structstudent *p = &a;
structstudent *q = (structstudent * ) malloc(sizeof(structstudent) + 10 *sizeof(int) );
printf("sizeof( a ) = %d\n ",sizeof( a ) );//8
printf("sizeof( *p ) = %d\n ",sizeof( *p ) );//8
printf("sizeof( *q ) = %d \n",sizeof( *q ) );//8
for( i = 0; i
{
(*q).a[i] = i * i;
}
for( i = 0; i
{
printf("%d\t", (*q).a[i]);// 0 , 1, 4,……,81
}
puts("");
return0;
}
这里定义了一个可变长的结构体,由sizeof( a )可知,数组a并没有占任何存储空间,为了给成员数组分配内存,必须使用malloc,但是分配完以后,sizeof( *q )还是8。可以理解,需要时柔性数组是结构体的一员,仅此而已。也可以认为柔性数组跟结构体没有任何关系,只是“挂羊头,卖狗肉”罢了,算不得结构体的正式成员。
柔性数组与成员指针完全不是一回事。
structstudent
{
intid;
int*a;
}; 上面结构体里定义了一个指针,指针要占内存,且指向一块内存,柔性数组的功能和成员指针类似,但却是完全不同的东西,柔性数组中,数组的成员和结构体其他成员地址是连续的,成员指针就完全不一样了。
很少见人用柔性数组。
7) 枚举和#define的区别
(1) 枚举常量是实体中的一种,但宏不是实体;(2) 枚举常量属于常量,但宏不是常量(有些书把类对象宏称为预处理常量,这是错误的说法,标准C/C++没有预处理常量这种不知从哪里冒出来的说法);(3) 枚举常量具有类型,但宏没有类型
8) 类型定义、别名
可以用typedef 和define来为已有的数据类型定义新的数据类型,准确地说,应该是取一个别名。
(1)typedef 不支持类型扩展
#define INT32 int
unsignedINT32i = 10;
typefdefintint32;
unsigned int32 j = 10;//出错
(2)#define有副作用
#define PCHAR char*
PCHARp1, p2;// p2是char型,而不是期望的char*型数据
typedefpcharchar*;
pchar p3, p4;
9) 有关注释
A. int/*……*/i; 合法,编译器将剔除注释,然后用空格代替原来的注释
B.char *s = "abcdefgh; //higklmn"; 合法,用双引号括起来的都是常量
C.//Is it a \ 合法,\是续接符
valid comment
D. in/*……*/t i; 不合法,见A解释。
10) 如何将数值存储到指定内存
解设我们现在需要往内出地址,0x12ff7c 上存放一个整型数0x100,那么怎样才能做到呢?这题看着很变态,但是确实有用的着的地方。曾经我找工作的时候就遇到过这个问题,当然了,是关于嵌入式方面的工作。
(1) int *p = (int *)0x12ff7c;
*p = 0x100;
(2) *(int *)0x1277fc = 0x100;
这题很特别,写出来一看就懂,第一次遇到这种题的人大多都蒙了。
11)如何不使用任何变量编写strlen函数?
代码如下:
intmy_strlen1(constchar*strDest)
{
return*strDest ? 1 + my_strlen1(strDest + 1 ) : 0;
}更符合规范的代码示例:
intmy_strlen2(constchar*strDest)
{
assert( NULL != strDest );
return('\0'!= *strDest ) ? ( 1 + my_strlen2( strDest + 1 )) : 0;
}
12) 下面代码的输出结果是多少?为什么?
#include
#include
intmain(intargc,char* argv[])
{
chara[1000];
inti;
for( i = 0; i
{
a[i] = -1 - i;
}
printf("%d\n", strlen(a));
return0;
}答:输出结果是255。只要知道两点,这题也不难(1.char其实可以看成是只占一个字节的整型。 2.char型数据的表示范围是[-128——127] ),由char数据类型的表示范围可知,a[0] ——a[254]都不为0, 而a[255]的值为0, 也就是字符串中的'\0',所以数据结果为255.