本文最后更新于 621 天前,其中的信息可能已经有所发展或是发生改变。
数组
数组名是该数组类型的常量指针,不能被修改。数组名只有在两种情况下,不用常量指针的来表示:
* 当数组名作为 sizeof 操作符的操作数
* 当数组名作为单目操作符 & 的操作数
下标引用与间接访问完全相同
arrar[subscript]
*(array + subscript)
PS:在进行指针加法时会对加数进行调整!
2[array]
是合法的,等于 *(2+array)
,即(array + 2)
,与array[2]
相等。
字符串复制
void strcpy(char *buffer, char const *string)
{
while((*buffer++ = *string++) != '\0')
;
}
形参被声明为 const 的理由
* 查看函数原型就能发现数据不会被修改
* 编译器捕捉修改该数据的错误
* 允许向函数传递 const 参数
静态和自动初始化
静态 static 初始化只在程序开始前执行一次
自动变量位于运行时堆栈中,执行流每次进入它所在的代码块时,这类变量每次所处的内存位置可能并不相同。程序开始前,编译器无法对这些位置进行初始化。自动变量在缺省的情况下是未初始化的,如果自动变量的声明中给出了初始值,每次当执行流进入自动变量声明所在的作用域时,变量就被一条隐式的赋值语句初始化。
字符数组和字符串常量
char msg1[] = "hello";
char *msg2 = "hello";
前者初始化一个字符数组的元素,后者是一个真正的字符串常量。
多维数组
matrix[1][5] = ((matrix + 1) + 5)
int vector[10], *vp = vector; //合法
int matrix[3][10], *mp = matrix; //非法 指向整型的指着
//正确方式
int (*p)[10]; //指向整型数组的指针
判断参数与关键字列表匹配
使用指针数组
#include <string.h>
int lookup_keyword( char const * const desired_word,
char const *keyword_table[], int const size)
{
char const **kwp;
for(kwp = keyword_table; *kwp != NULL; kwp++)
{
if( strcmp(desired_word, *kwp) == 0)
{
return kwp - keyword_table;
}
return -1;
}
}
查看关键字const右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。