目录
在c语言中指针与数组的关系十分密切,通过数组下标所能完成的任何操作通过指针都可以实现。用指针编写的程序要比用数组下标编写的程序执行速度快。
一维数组与指针
定义一个一维数组,系统会在内存中为该数组分配一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组。
例如: int *p,a[10]; p=a;
a是数组名,同时也就是数组首地址,将它赋给指针变量p。(将数组a的首地址赋给p)
int *p,a[10]; p=&a[0];
这两条幅值语句效果都是将数组a中的首个元素的地址赋给变量p。
一维数组与指针之间的使用:
1)p+n与a+n:数组元素a[n]的地址(&a[n])。
对于a这个数组而言,共有10各元素,n的取值为0~9,则对数组元素地址可以表示:p+0~p+9或a+0~a+9.
2)如何来表示数组中的元素用到前面介绍的数组元素的地址表示:*(p+n)和*(a+n)来表示数组中的各元素。
3)表示指针移动:“++”“--”运算符
#include <stdio.h> #include <stdlib.h> int main() { int *p; int i,a[10]; p=a; printf("请输入十个元素:\n"); for(i=0;i<10;i++) scanf("%d",a+i); printf("该数组中的元素为:\n"); for(i=0;i<10;i++) printf("%5d",*(p+i)); return 0; }
1、使用指针修改数组元素
int array[2]; int *p; p = array; // 或 p = &a[0]; *p = 5; printf("a[0]=%d\n", a[0]); // 输出:a[0]=5
2、使用指针遍历数组
// a、平常我们是这样遍历数组的 int array[3] = {1, 2, 3}; for(int i=0; i<3; i++) { printf("a[%d]=%d\n", i, a[i]); } // b、用指针可以这样遍历数组 // 如果 p 是指向数组array的首元素array[0] // 那么 p+1 则会根据数据类型 int 从而指向数组array的第二个元素array[1] // 在16位编译器环境下,p+1代表增加2个字节 int *p = array; for(int i=0; i<3; i++) { printf("a[%d]=%d\n", i, *(p+i)); } // c、指针遍历2 // 此种方法相比于上一种方法不同的是:上一种方法指针p不变,而这种p每循环一次就改变一个 for(int i=0; i<3; i++) { printf("a[%d]=%d\n", i, *(p++)); } // d、指针遍历3 // 数组跟指针有着密不可分的关系,array[i]也可以写成*(array+i) for(int i=0; i<3; i++) { printf("a[%d]=%d\n", i, *(array+i)); }
3、指针,数组与函数参数
// 定义一个修改数组首元素的函数 void change(char c[]) { c[0] = 0; } void main() { char a[3]; change(a); // 传入数组地址 printf("a[0]=%d\n", a[0]); // 输入:a[0]=10 } // 也可传入指针 void main() { char a[3]; char *p = a; change(p); // 传入地址 printf("a[0]=%d\n", a[0]); // 输入:a[0]=10 } // 当然,change函数还可以改成这样 void change(char *c) { *c = 10; // 或c[0] = 10; }
1~3引用于(1、使用指针修改数组元素 ~3、指针,数组与函数参数):10、C语言 —— 指针与一维数组(指针数组与数组指针) - 写给未来的自己 - OSCHINA - 中文开源技术交流社区
二维数组与指针
二维数组与指针之间的使用:
1)&a[0][0]既可以看作数组0行0列的首地址,同时也可以看作是二维数组的首地址。
&a[m][n]就是第m行n列元素的地址
2)a[0]+n:第0行第n个元素地址
3)&a[0]是第0行的首地址,当然&a[n]是第n行的首地址
4)a+n:第n行的首地址
5)*(*(a+n)+m):第n行第m列元素
6)*(a[n]+m):第n行第m列元素
7)*(a+n) = a[n]
8) a[n]+m:第n行第m个元素地址
#include <stdio.h> main() { int x[3][4] = {1,3,5,7,9,11,2,4,6,8,10,12} ; int (*p)[4] = x, k = 1, m, n = 0; for(m=0; m < 2; m++) n += *(*(p+m)+k); printf("%d\n",n);
总结:
一个通过数组和下标实现的表达式可等价地通过指针或偏移量实现。