float f;
char* cp=&f;
此种写法,编译时不会报错,但会提出警告。
解析:指针变量是有类型的,所有类型的指针变量所占空间大小是相等的,都是某个字节的地址。但不同类型的指针变量代表从这个字节的地址完后数几个字节表示该指针所指向的内容,比如char* 类型指针变量所指向的内容就是它所指向的那个字节的地址,而float*类型变量所指向的float类型变量的值存储在他所指向的字节的地址往后数3个字节(一共4个字节)内。这样直接读地址赋值是可以的,但逻辑上时错误的。对后面的使用也会造成影响。
2、
char* cp;
printf("%s",cp);
此种写法,编译不会报错,但运行时会提示segment fault.
解析:指针在没有显式初始化时,都是默认初始化成NULL的。所以在指针beifuzhi之前不能使用。
3、
int a[2][]={{2,3},{3,4}};
此种写法,编译会报错。
解析:在数组定义并初始化时,可以前面的维数不指定,后面的维数指定。但不可以反过来。
4、
int a=b=0;
此种写法,编译会报错,会提示变量b没有定义。
int a,b=a=0;
此种写法,不会报错,因为变量a已经提前定义过。
5、
char str[20];
str="test";
此种写法编译时会报错,因为str被当做字符数组来对待,字符数组只有在定义时初始化的情况下才可以用双引号内的字符串赋值,不能再定以后另外的语句这样赋值。
注意:虽然str也是指向此字符数组的第一个元素的指针,但str并不是一个指针变量。假如str是一个指针变量,如下:
char* str;
str="test";
这种写法是正确的,因为此时str不是一个数组,而是一个字符型指针变量。此处代表一个字符型指针变量指向一个字符串常量的首地址。
6、
double d=1234.0;
printf("d=%d\n",d);
说明:以上用法是错误的,因为没有对double类型数据d进行强制转换。输出结果并不是d=1234.
double d=12345678901.0;
printf("d=%d\n",(int)d);
说明:以上用法也是错误的。虽然对double类型数据d进行了强制转换。但是double类型d所表示的数据的大小已经超过int型数据所能表示的范围。输出结果不会是d=123456789。一般在使用存储长度较长的数据类型向存储长度较短的数据类型转换时需要谨慎。
long l=1234;
printf("l=%d",l);
说明:以上运行结果可能是l=1234,但这种用法是不严谨的。应该用强制转换。
long l=1234567891;
printf("l=%d\n",(int)l);
说明:以上用法是错误的,因为long的存储长度大于int的存储长度,并且l的值已经超过了int型数据能表示的范围。输出结果不会是:l=1234567891。