基本概念:
1)“*操作数”称为间接访问表达式,它的操作语义是引用以操作数为地址的变量。操作数可以是表达式,但其值必须是地址值。所以间访表达式的值是一个左值,代表指针所指的变量。而指针所指的类型就是间访表达式运算的类型。
例:int y,x[3]={1,2,3},*pi=x;
y=*pi++;是先对pi进行++操作,然后计算px,即对px进行间访操作,由于没有到达序列点,*pi还是x[0].再对y进行赋值,使y值为1.由于语句结束是序列点,这时才对pi进行自增操作,使pi指向x[1]。
数组指针表示:
一维数组中元素及元素地址表示
表示方式 | 元素 | 元素地址 |
用素组下标表示 | a[i] | &a[i] |
用指针p的下标表示 | p[i] | &p[i] |
用数组名的指针表示 | *(a+i) | (a+i) |
用指针p的指针表示 | *(p+i) | (p+i) |
用数组名构成的地址表达式和下标表示 | (a+i)[0] | (a+i) |
用指针构成的地址表达式和下标表示 | (p+i)[0] | (p+i) |
原来数组还可以这么输入,我还以为scanf(“%d”,p[i])错了呢。
#include "stdio.h"
#define N 6
int main(void){
int i,a[N],*p[N],sum=0;
for(i=0;i<N;i++){
p[i]=&a[i];
scanf("%d",p[i]);
sum+=*p[i];
}
for(i=0;i<N;i++){
printf("p[%d]=%p,result=%d\n",i,p[i],*p[i]);
}
printf("sum=%d\n",sum);
getchar();
getchar();
return 0;
}
二维数组与指针数组:
#include <stdio.h>
int main(void)
{
int x0[5],x1[5],x2[5],x3[5],x4[5];
int *p[5],i,j;
p[0]=x0;p[1]=x1;p[2]=x2;p[3]=x3;p[4]=x4;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(i==j)
p[i][j]=1;
else
p[i][j]=0;
}
}
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%4d",p[i][j]);
printf("\n");
}
getchar();
return 0;
}