如果对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列