C和指针-4


数组

数组名是该数组类型的常量指针,不能被修改。数组名只有在两种情况下,不用常量指针的来表示:
* 当数组名作为 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右边来确定什么被声明为常量 ,如果该关键字的右边是类型,则值是常量;如果关键字的右边是指针变量,则指针本身是常量。

  • 分享:
评论
还没有评论
    发表评论 说点什么