C指针小结2

╰+攻爆jí腚メ 2022-08-07 10:55 365阅读 0赞
  1. C指针小结2
  2. 在上一篇对指针的小结中只是片面的说明了指针的概况,与基本含义,其实说到指针必然要提及数组,数组与指针有着密不可分的联系。但是切记数组和指针根本是两个东西,指针不能和数组画等号。
  3. 数组:
  4. 例如 int a\[10\];这声明的是一个由10个整形组成的数组,其中包含10个整形元素,同时数组名的值是一个指针常量,也就是数组第一个元素的地址。如果前面声明的是其他类型那么,数组名的类型就是“指向其他类型的常量指针”。之前说过数组与指针不是一个东西,那么他们的区别在哪里?
  5. 1.数组具有确定数量的元素,而指针是一个标量,只有当数组名在表达式中使用时,编译器才会为他们产生一个指针常量。
  6. 2.数组名是一个指针常量,不能被修改,只有在两种场合下,数组名并不用指针常量来表示,就是当使用sizeof关键字和使用&运算符的时候,分别返回整个数组的长度和一个指向数组的指针。
  7. 3.并且一般建立数组后都会给数组开辟实际存在的空间。

数组内容的引用:

  1. 众所周知想引用数组的内容一般有两种方法:
  2. 1.下标引用
  3. 2.间接引用
  4. 除了\[\]的优先级比\*高外没有什么区别。
  5. 例如:
  6. a\[3\] 或者 \*(a+3);
  7. 关于指针引用和下标引用哪一个更有效率的问题:

毫无疑问指针引用的速度绝对比下标引用快,因为编译器在对下标处理时更费时间,当然只是指针引用的效率高而已,在现实实际的问题前面,指针不一定就更快了。因为频繁使用指针的代码必然看起来更复杂,可读性和下标法比起来较差。

  1. 以下有几个小技巧:
  2. 1.当你根据某个固定的数目的增量在一个数组移动时,指针更加便捷。
  3. 2.声明为寄存器变量比静态存储变量效率更高。
  4. 3.尽量少使用计数器
  5. 4.在运行时出现&与sizeof将会付出很多时间与资源

指针数组:

  1. 就是由指针组成的数组,即每一个数组内元素就是一个指针,这个应用在字符串应用尤其多。
  2. char \*p\[3\]=\{
  3. \{"hello"\},
  4. \{"Linux"\},
  5. \{"DDD"\},
  6. \};
  7. 小结与提示:
  8. 1.请不要在一个未指定长度的数组的指针上执行指针运算。
  9. 2.只要有可能,函数的指针形参都应该声明为const
  10. 关于字符指针变量和字符数组的讨论:
  11. 例如:

char *cp; 与char str[20];

  1. str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址
  2. 赋值方式:
  3. str="i love linux"错误,数组只能对元素赋值。
  4. cp="i love linux"正确
  5. 数组也可以在最开始赋值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

  1. int matrix\_multiply(int \*m1, int \*m2,register int \*r, int x, int y,int z)
  2. \{
  3. register int \*m1p;
  4. register int \*m2p;
  5. register int k;
  6. int row;
  7. int column;
  8. for(row=0;row<x;row++)
  9. \{

for(column=0;column<z;column++)

{

m1p=m1+row*y;

m2p=m2+column;

*r=0;

  1. for(k=0;k<y;k+=1);
  2. \{
  3. \*r+=\*mlp\* (\*m2p);

m1p++;

m2p+=z;

}

  1. r++;
  2. \}
  3. \}
  4. \}

发表评论

表情:
评论列表 (有 0 条评论,365人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C指针3

                                                      C指针小结3        现在总结指针的更高一级的用法,

    相关 C指针1

                                                C指针小结1      我认为C语言的核心就是指针和对内存的操作,而操作内存就是由指针