C指针小结2
在上一篇对指针的小结中只是片面的说明了指针的概况,与基本含义,其实说到指针必然要提及数组,数组与指针有着密不可分的联系。但是切记数组和指针根本是两个东西,指针不能和数组画等号。
数组:
例如 int a[10];这声明的是一个由10个整形组成的数组,其中包含10个整形元素,同时数组名的值是一个指针常量,也就是数组第一个元素的地址。如果前面声明的是其他类型那么,数组名的类型就是“指向其他类型的常量指针”。之前说过数组与指针不是一个东西,那么他们的区别在哪里?
1.数组具有确定数量的元素,而指针是一个标量,只有当数组名在表达式中使用时,编译器才会为他们产生一个指针常量。
2.数组名是一个指针常量,不能被修改,只有在两种场合下,数组名并不用指针常量来表示,就是当使用sizeof关键字和使用&运算符的时候,分别返回整个数组的长度和一个指向数组的指针。
3.并且一般建立数组后都会给数组开辟实际存在的空间。
数组内容的引用:
众所周知想引用数组的内容一般有两种方法:
1.下标引用
2.间接引用
除了[]的优先级比*高外没有什么区别。
例如:
a[3] 或者 *(a+3);
关于指针引用和下标引用哪一个更有效率的问题:
毫无疑问指针引用的速度绝对比下标引用快,因为编译器在对下标处理时更费时间,当然只是指针引用的效率高而已,在现实实际的问题前面,指针不一定就更快了。因为频繁使用指针的代码必然看起来更复杂,可读性和下标法比起来较差。
以下有几个小技巧:
1.当你根据某个固定的数目的增量在一个数组移动时,指针更加便捷。
2.声明为寄存器变量比静态存储变量效率更高。
3.尽量少使用计数器
4.在运行时出现&与sizeof将会付出很多时间与资源
指针数组:
就是由指针组成的数组,即每一个数组内元素就是一个指针,这个应用在字符串应用尤其多。
char *p[3]={
{"hello"},
{"Linux"},
{"DDD"},
};
小结与提示:
1.请不要在一个未指定长度的数组的指针上执行指针运算。
2.只要有可能,函数的指针形参都应该声明为const
关于字符指针变量和字符数组的讨论:
例如:
char *cp; 与char str[20];
str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址
赋值方式:
str="i love linux"错误,数组只能对元素赋值。
cp="i love linux"正确
数组也可以在最开始赋值char str[30]="i love linux";
现在总结下那些令人头疼的指针的声明:
⑴ int *p[3]; 指针数组
⑵ int (*p)[3]; 指向一维数组的指针
⑶ int *p(int); 返回指针的函数
⑷ int (*p)(int); 指向函数的指针(以一个整形为参数)返回一个整型变量
⑸ int *(*p)(int); 返回一个指针的指向函数的指针
⑹ int(*p[3])(int); 函数指针数组,函数返回整型变量
⑺ int *(*p[3])(int); 函数指针数组,函数返回整型指针
最后再来一个小例题:
用指针方式实现矩阵乘法:
例如
2 -6 4 -2 -4 -5 50 14 -44 -52
3 5 * = -23 -21 18 20
1 -1 -7 -3 6 7 11 1 -10 -12
int matrix_multiply(int *m1, int *m2,register int *r, int x, int y,int z)
{
register int *m1p;
register int *m2p;
register int k;
int row;
int column;
for(row=0;row<x;row++)
{
for(column=0;column<z;column++)
{
m1p=m1+row*y;
m2p=m2+column;
*r=0;
for(k=0;k<y;k+=1);
{
*r+=*mlp* (*m2p);
m1p++;
m2p+=z;
}
r++;
}
}
}
原文地址:http://blog.csdn.net/zmrlinux/article/details/44812045