我还是一个初学者,今天看了一天的书,总结了如下知识点。
指针与数组
int *p ;
p = &a;
*p = 1;
指针:指针就是一个地址,指针变量是存放地址的变量,指针变量的值就是指针p指向那个元素的地址。
p = &a; //把a的地址赋给指针变量p
指针变量p的值就是a的地址,p指向a
printf(“%d”,*p)
输出指针变量p所指向变量的值,即a的值。
*p = 1;
将1赋给p所指向的变量,如果p指向a,则a=1;
p.230 通过指针引用数组
int a[10];
int *p;
p = &a[0]; //p的值就是a[0]的地址
p = a; //p的值就是数组a首元素的地址
在定义指针变量时对他初始化: int p = &a[0];
等效于下面两行:
int p;
p = &a[0] //不能写成p = &a[0],因为p是一个值,而不是地址。
当然定义时也可以写成int *p = a; //其作用是将数组a首元素(即a[0])的地址赋给指针变量p,而不是把数组a的各元素赋给p
在指针指向数组元素时,可以对指针进行如下运算。
p + 1;
p - 1;
p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
执行p+1时,例如数组元素是int型,p+1意味着使p的值加4个字节,以使他指向下一个元素,p+1代表的地址实际为p+1*d,d是
一个元素所占的字节数(V C++ 6.0中,int,float,long型均为4字节,char为1字节),若p的值为2000,则p+1为2004.
p++,p–
++p,–p
如果p原来指向a[0],++p后,p指向a[1]。
p1 - p2
两指针相减(只有在p1和p2都指向同一数组里的元素时才有意义)。
如执行p2-p1,结果是p2-p1的值(两地址之差)再除以数组元素的长度。如果p2指向int型数组元素a[3],p1指向int型数组元素a[1],
p2的值为2020,p1的值为2012,则p2-p1的结果是(2020=2012)/4=2,这个结果表示p2和p1之间差2个元素。
两地址不能相加,p1+p2是无意义的。
如果p的初值为a[0],则p+i和a+i就是数组元素a[i]的地址,注意a代表首元素的地址,a+1也是地址,计算方法同p+1
例如p+9和a+9的值是&a[9],它指向a[9]。
(p+i)和(a+i)是p+i和a+i所指向的数组元素a[i]。例*(p+5)和*(a+5)就是a[5]。
根据以上所述,引用一个数组元素有两个方法
1.下标法,如a[i];
2.指针法,如*(a+i)或*(p+i),a是数组名,p是指向a的指针变量,其初值p=a;
举个例子,有一个元素个数为10的整型数组a[10[,要求输出其中全部元素。
#include <stdio.h>
int main()
{
int a[10];
int *p,i;
printf(“enter 10 numbers”);
for(i = 0;i < 10;i++)
{
scanf("%d",&a[i]);
}
for(p = a;p<(a+10);p++)
{
printf("%d",p);
}
return 0;
}
第二个for循环中先使指针变量p指向a的首元素a[0],然后用输出函数输出p,*p就是a[0]的值。然后执行p++,使p指向下一个元素
a[1],再输出其值。
利用指针引用数组元素也有一些技巧,且看下面的例子。
1.
p++;
p;
p++使p指向下一个元素,然后再执行p,得到下一个元素a[1]的值。
2.
p++;
这里要注意,和++同优先级,结合方向自右而左,所以相当于(p++),先实现p的运算,再使p自增1.
3.
++p
这里等价于(++p),注意,这里使先让p自增1,再实现p。
若p得初值为a(即&a[0]),若输出(p++),则得到a[0]的值,若输出*(++p),则得到a[1]的值。
4.
++(p)
这里是先执行p的运算,再使运算的结果值+1,如果p = a,则是a[0]的值加1。
++和–运算符用于指针变量非常有效,例如,想输出a数组的100个元素,可用以下方法。
p = a;
while(p < a + 100)
{
printf("%d",*p++);
}
希望能对初学者有用,非常感谢您阅读我的文章