C语言第二张,C语言细节 第2页_Linux编程_Linux公社-Linux系统门户网站

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. 0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值