C和指针:对数组的学习记录
扫描二维码
随时随地手机看文章
1.1
2[arry] = *(arry + 2) = arry[2]
1.2
下标绝不会比指针更有效率,但指针有时会比下标有效。
结论:
1.当根据某个决定数目的增量在一个数组中移动的时候,使用指针比使用下标产生效率更高的代码。当这个增量是1并且机器具有地址自动增量模型时,这点表现更突出。
2.声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。
3.如果可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,就不需要使用单独的计数器。
4.那些必须在运行时求值的表达式较之诸如&arry[SIZE]或(arry + SIZE)这样的常量表达式往往代价更高。
1.3
传址调用是通过传递一个指向所需元素的指针来实现的,函数得到的是该指针的拷贝。
void strcpy( char *bugger, char const *string) { while( (*buffer++ = *string++) != ' ') ; }
形参被声明为指向const字符的指针有3个理由:
1.良好的文档习惯。观察函数原型就能发现该数据不会被修改。
2.编译器可以捕捉到任何试图修改该数据的意外错误。
3.这类声明运行想函数传递const参数。
如果函数需要知道数组长度,必须将数组长度作为一个显式的参数传给函数。
1.4
自动变量在默认情况下不初始化。如果自动变量的声明中给出了初始值,每次当执行流进入自动变量声明所在的作用域时,变量就被隐式的赋值语句初始化。所以注意时间开销。
不完整的初始化会将省略的最后几个初始值初始为0。
char message[] = "hello"; char *message = "hello";
上述代码第1行为初始一个字符数组的元素,变量。第2行为初始一个字符串指针,指向该字符串常量。
2.1
int matrix[3][10]; int *p[10] = matrix; int *pi = &matrix[0][0]; int *pi = matrix[0];
2.2
作为函数参数的多维数组
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 };