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; //空指针可以接受其它类型指针值
}
`