C语言深度剖析

1. sizeof 是关键词不是函数,可以这么写:sizeof(int)/sizeof(i)/sizeof i,但不能这么写sizeof int!“size(int) * p”表示什么意思呢?sizeof(int) = 4,所以是“4*p”!
留个问题:以下代码运行,先后打印什么呢?
#include

void fun(int a[100])
{
printf("\n\nIn the fun function!\n\n");

printf("sizeof(a) = %d.\n", sizeof(a)); //care about this one
printf("sizeof(a[100]) = %d.\n", sizeof(a[100]));
printf("sizeof(&a) = %d.\n", sizeof(&a));
printf("sizeof(&a[100]) = %d.\n", sizeof(&a[100]));
}

int main(int argc, char *argv[])
{
char *p = NULL;
int a[100];

printf("sizeof p = %d.\n", sizeof p);
printf("sizeof *p = %d.\n", sizeof *p);

printf("sizeof(a) = %d.\n", sizeof(a)); //care about this one
printf("sizeof(a[100]) = %d.\n", sizeof(a[100]));
printf("sizeof(&a) = %d.\n", sizeof(&a));
printf("sizeof(&a[100]) = %d.\n", sizeof(&a[100]));

fun(a);

return 0;
}
第一句:当sizeof操作的是一个结构体或者变量时,返回值为它的实际大小,这个实际大小可能包括为了字节对齐插入的多余字节。如main函数里第三个打印出"sizeof(a) = 400.";
第二句:如果操作的是一个静态大小的数组,返回整个数组的大小;
第三句:如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。如fun()函数中打印出"sizeof(a) = 4.";
第四句:sizeof操作符不能返回动态开辟的数组或形参数组的大小。

2. 定义与声明的区别:创建了对象并为对象分配了内存是定义;只创建了对象未分配内存是声明。

3. for循环的初始化声明只在C99下允许。即for(int k = 0; k < 10; k++)这样的写法,只在C99模式下被允许。

4. strlen()函数。如下源码,输出是多少呢?
#include
#include

int main(int argc, char *argv[])
{
char a[1000];
int i;

for(i = 0; i < 1000; i++)
a[i] = -i - 1;

printf("sizeof(a) = %d.\n", strlen(a));

return 0;
}
注:strlen()函数用于计算字符串长度,判断字符串是否结束的标志是是否遇到‘\0',如果遇到,则认为本字符串结束。分析到此,应该猜到打印出的结果是“sizeof(a) = 255.”了。

5. void:void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
void关键字的使用规则:
规则一 如果函数没有返回值,那么应声明为void类型
在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。
规则二 如果函数无参数,那么应声明其参数为void
规则三 小心使用void指针类型
规则四 如果函数的参数可以是任意类型指针,那么应声明其参数为void *
规则五 void不能代表一个真实的变量

C语言深度剖析

猜你喜欢

转载自2482696735.iteye.com/blog/2253862