如果对c语言有兴趣,可以关注我,谢谢
1。指针和数组的关系,数组是指的一组数,咱们可以通过数组的下标一个一个来对数据进行访问和操作。说白了,对于数组中的每一个空间,其实都是变量的存储空间。这些空间都有地址。因此可以将每一个空间的地址给指针变量,这样就可以用指针来取数组中的数据了。如:
int a[10],*p;
*p=&a[0]; 或者 *p=a; //两者功能一样,其实都是把数组中的第一个空间中的地址给了指针变量p.
还可以取 *p=&a[1]这是将数组中的第二空间的址址给了指针变量p.
2。指向数组的指针的运算,注意这是指针的运算,不是指针所指向的数据的运算 。 下述例子中,指针可以指向数组中的每一个数据。不过,也比较麻烦,就是需要对数组中的每个空间都要取地址,然后赋给指针变量。可不可以有更好的更方便的方法来用指针地来由于看过和操作数组中的数据呢?是可以的。如,
p=&a[0];
那么 p+1就指向了 a[1]中的数据,p+3就指向了 a[3]中的数据。
如果 p=&a[9]; 那么 p-1就指向a[8]中的数据,p-9就指向了a[0]中的数据
假设 p=&a[9]; q=&a[3]; 那么 p-q 就等于 9-3=6 。 q-p就等于 3-9=-6.
另外,指针可以进行关系运算(< <= > >=)和判等运算(!= ==).
3。指针用于数组处理,既然指针和数组有着紧密的关系,那么指针也肯定可以对数组进行操作。如:
从键盘上读入数组:
int a[10], *p;
p=&a[0];
for(i=0;i<10;i++)
scanf("%d",p+i); //这里也可以用于p++,但是要注意,p自身发生了变化。
在屏幕上输出数组:
int a[10], *p;
p=&a[0];
for(i=0;i<10;i++)
printf("%d",*(p+i)); //这里也可以用*p++,但是要注意,p自身发生了变化。
还可以对数组中的值进行计算操作:
int a[10], *p,sum=0;
p=&a[0];
for(i=0;i<10;i++)
sum+=*(p+i); //这里也可以用于*p++,但是要注意,p自身发生了变化。
4. 数组名可以作为指针,指针也可以作为数组名,如,int a[10] ; *(a+6) 和 a[6]效果是一样的。
用指针作为数组名,如:
int a[10],*p;
p=&a[0];
p[1]和*(p+1)是一样的效果。
5。指针和多维数组 ,这里只来说明一下二维数组。在内存当中,不管是一组数组还是二维数组,都是按顺序存的,也就是说,对于长度为10的一维数组,在空间当中是批量连续开辟10个空间,对于10*10的二维数组,是批量连续开辟100个空间。因为这个特点,可以通过指针很方便地操作二组数组(即,可以用一个循环就可以对二维数组进行操作)。如:
int a[10][10],*p;
p=&a[0][0];
for (i=0;i<10*10;i++)
*p++=0;
6. 处理多维数组的行,如果想用指针来访问多维数组中的一行元素,假设操作一个二维数组中第i行中的元素。如:
int a[10][10], *p;
p=&a[i][0];//这里表示指向第i行的第0个元素。
那么 p+1表示第i行的第1个元素即 a[i][1]
那么 p+2表示第i行的第2个元素即 a[i][2]
那么 p+3表示第i行的第3个元素即 a[i][3]
7. 处理多维数组中的列,如果准备用指针来操作某一列中的元素,如何进行操作呢?
int a[10][10], (*p)[10];
p=&a[0]; //这里是取第0行的地址,
p+1是取得第1行的地址
p+2是取得第2行的地址
p+3是取得第3行的地址
那么取第i列的元素,应该做如下操作
(*p)[i] 表示第0行的第i列
(*(p+1))[i] 表示第1行的第i列
(*(p+2))[i] 表示第2行的第i列
我用C语言开发已有十几年了,经常看到有新手搞不清楚指针和数组。
数组
首先说数组,声明一个数组后,它是有内存的,比如char a[10],那么,数组a就有10个字节的内存。
所以,你可以用下标来使用它,只要下标不超过10 - 1,都不会出错。
指针
如果把数组看作是一串粘在一起的盒子,指针则是一个挂钩。只有挂钩钩上一块内存时,你才可以用它。比如声明一个指针p:char *p;,此时,你还没法用它,只有p钩上一块内存后,即赋值后,才可以用。比如p = a; 或p = &a[0];。
注意
指针本身也是有内存的,比如int b;,b占4个字节,那么char *p;,p的类型为char *,所以p本身也占4个字节。也可以取它的地址,即二级指针:char **pp = &p;。
数组本身也可以看作一个指针指向一块内存,而指针就是数组名。比如上面的a。可以把a赋值给p:p = a;。更常用的是在函数调用时。比如有一个排序函数:qsort(char *p, int n);,它需要一个数组和数组的元素数作为参数,可以这样调用:qsort(a, 10);
欢迎讨论,欢迎关注我的头条号。
数组就是指针。只不过编译器定义时候,多一些约束而已。
- 下一篇:该怎么复习《教育知识与能力》呢?
- 上一篇:哪个品牌婚戒款式更多更好看?