C和指针_第8章_数组_学习笔记

本文探讨了C语言中指针与数组的有效使用方法,包括如何选择指针或下标操作以提高代码效率,如何声明寄存器变量以优化性能,以及如何避免不必要的运行时计算。同时介绍了传址调用的概念,并解释了为什么形参应声明为指向const类型的指针。此外,还讨论了自动变量的初始化问题及多维数组作为函数参数的正确方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.2

2[arry]  = *(arry + 2) = arry[2]

1.3

下标绝不会比指针更有效率,但指针有时会比下标有效。

结论:

    1.当根据某个决定数目的增量在一个数组中移动的时候,使用指针比使用下标产生效率更高的代码。当这个增量是1并且机器具有地址自动增量模型时,这点表现更突出。

    2.声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。

    3.如果可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,就不需要使用单独的计数器。

    4.那些必须在运行时求值的表达式较之诸如&arry[SIZE]或(arry + SIZE)这样的常量表达式往往代价更高。

1.6

传址调用是通过传递一个指向所需元素的指针来实现的,函数得到的是该指针的拷贝。

void strcpy( char *bugger, char const *string)
{
    while( (*buffer++ = *string++) != '\0')
    ;
}

形参被声明为指向const字符的指针有3个理由:

    1.良好的文档习惯。观察函数原型就能发现该数据不会被修改。

    2.编译器可以捕捉到任何试图修改该数据的意外错误。

    3.这类声明运行想函数传递const参数。

如果函数需要知道数组长度,必须将数组长度作为一个显式的参数传给函数。

1.8

    自动变量在默认情况下不初始化。如果自动变量的声明中给出了初始值,每次当执行流进入自动变量声明所在的作用域时,变量就被隐式的赋值语句初始化。所以注意时间开销。

    不完整的初始化会将省略的最后几个初始值初始为0。

char message[] = "hello";
char *message = "hello";    

上述代码第1行为初始一个字符数组的元素,变量。第2行为初始一个字符串指针,指向该字符串常量。

2.4

int matrix[3][10];
int *p[10] = matrix;

int *pi = &matrix[0][0];
int *pi = matrix[0];

2.5

作为函数参数的多维数组

void func( int (*mat)[10] );
void func( int mat[][10] );

以上做法为正确的,函数原型写成下面这样是不正确的:

void func( int **mat );             //ERROR!!!

3.

    创建指针数组时,可以以矩阵的形式存储,也可以以指向字符串常量的指针数组形式存储。在矩阵中,每行必须与最长字符串的长度一样长,但其不需要任何指针。指针数组本身要占用空间,但每个指针所指向的字符串所占用的内存。

//矩阵
char const keyword[][9]=
{
    "do",
    "for",
    "if",
    "register",
    "return",
    "switch",
    "while"
};

//指针数组
char const *keyword[] = 
{
    "do",
    "for",
    "if",
    "register",
    "return",
    "switch",
    "while",
    NULL
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值