1:左值:标识一个特定的位置的值才能作为左值。
2:判断表达式的长度不需要对表达式求值。
例如:sizeof(a=b+3)并没有向a赋值。
3:C语言并不具备布尔类型。
4:一些表达式也可以作为左值。
例如:a[i+10]=0;
5:define
宏与替换的区别
宏有参数。
6:把宏插入字符串中的技巧:
①:利用字符串:
#include <stdio.h>
#define M 9
#define PRINT( FORMAT, VALUE ) printf("the value is " FORMAT" %d\n", VALUE)
int main()
{
int x;
PRINT("value",M);
return 0;
}
②:
#include <stdio.h>
#define M 9
#define PRINT( FORMAT, VALUE ) printf("the value of " #VALUE " is " FORMAT"\n",VALUE)
int main()
{
PRINT("%d", "M");
return 0;
}
7:malloc(动态分配内存函数)
原型:extern void *malloc(unsigned int num_bytes);
头文件:#include <malloc.h> 或 #include <stdlib.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)
功能:分配长度为num_bytes字节的内存块
说明: 如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
再使用时应注意void* 类型可以强制转换为任何其它类型的指针。
这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。
我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,
我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。
2:判断表达式的长度不需要对表达式求值。
例如:sizeof(a=b+3)并没有向a赋值。
3:C语言并不具备布尔类型。
4:一些表达式也可以作为左值。
例如:a[i+10]=0;
5:define
宏与替换的区别
宏有参数。
6:把宏插入字符串中的技巧:
①:利用字符串:
#include <stdio.h>
#define M 9
#define PRINT( FORMAT, VALUE ) printf("the value is " FORMAT" %d\n", VALUE)
int main()
{
int x;
PRINT("value",M);
return 0;
}
②:
#include <stdio.h>
#define M 9
#define PRINT( FORMAT, VALUE ) printf("the value of " #VALUE " is " FORMAT"\n",VALUE)
int main()
{
PRINT("%d", "M");
return 0;
}
7:malloc(动态分配内存函数)
原型:extern void *malloc(unsigned int num_bytes);
头文件:#include <malloc.h> 或 #include <stdlib.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)
功能:分配长度为num_bytes字节的内存块
说明: 如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
再使用时应注意void* 类型可以强制转换为任何其它类型的指针。
当内存不再使用时,应使用free()函数将内存块释放。
总结:
malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。
我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,
我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。