C语言深度解剖 (一)
原文链接: C语言深度解剖 (一)
前言
C语言的水深不见底,好在一些前辈们已经将很多雷区探了一遍
这里分享一下我在学习 《C语言深度解剖》 过程中的一些笔记和心得
概要
- TOC
{:toc}
sizeof
sizeof是关键字,而不是函数
main()
{
int i=0;
int a=sizeof(int); // 4 ,因为int类型占4个字节
int b=sizeof(i); // 4 ,因为i为int类型,占4个字节
int c=sizeof i; //4 这个写法也是可以的与上面的相同
// int d=sizeof int; //error C2059: syntax error : 'type'
}
Tip: 在VC++6.0中,我们可以使用 F10 开启debug的观察模式, F11 可以逐条执行代码,借此可以观察变量值在整个过程中的变化情况,而不必使用打印语句,并且这样观察的结果更切近实际情况,F9 可以安插断点,让程度一口气执行到断点的地方停住
#include <stdio.h>
int b[100];
void fun(int b[100])
{
int x=sizeof(b); //4,b此时只是一个指针,指针在32位平台中为4个字节
}
void main()
{
int *p=NULL,a[100];
int x=sizeof(p); //4,指针在32位平台中为4个字节
int y=sizeof(*p); //4,int型指针所指内容为int型整数,int型整数为4字节
int z=sizeof(a); //400,a为int型数组的首地址,100个元素,共400字节
int u=sizeof(a[100]); //4,第100个元素还是整型,占4字节,虽然这个元素因为越界并不存在
int v=sizeof(&a); //400,a为int型数组的首地址,100个元素,共400字节
int w=sizeof(&a[0]); //4,第0个元素还是整型,占4字节
int r=sizeof(b); //400,b为int型数组的首地址,100个元素,共400字节
fun(a);
}
signed/unsigned
#include <stdio.h>
#include <string.h>
int main()
{
char a[1000];
int i,b;
for (i=0;i<1000;i++)
{
a[i]=-1-i;
}
b=strlen(a); //255,因为遇到了'\0' , '\0' 的二进制码为 00000000 , 就成为了字符串的终结
return 0;
}
32位平台里:
signed int 型范围为 -2^31 ~ 2^31-1
char类型表示范围为 -2^7 ~ 2^7-1
unsigned int 型范围为 0~ 2^32-1
char类型表示范围为 0 ~ 2^8-1
编译器缺省情况下数据为signed类型
#include <stdio.h>
#include <string.h>
int main()
{
unsigned i;
for(i=9;i>=0;i--)
{
printf("%u\n",i);
}
}
这段代码会陷入死循环,因为i永远不可能小于零
void
#include <stdio.h>
#include <string.h>
int main()
{
float *p1;
int *p2;
void *p3;
//p1=p2; //warning C4133: '=' : incompatible types - from 'int *' to 'float *'
p1=(float*)p2; //经过转化是可以的
p2=(int*)p1; //经过转化是可以的
//p2=p1; //warning C4133: '=' : incompatible types - from 'float *' to 'int *'
p3=p1; //空指针可以接受其它类型指针值
p3=p2; //空指针可以接受其它类型指针值
}