数组和指针的比较
(1)指针变量的地址:指向内存中一个存储单元的第一个字节的地址。数组名的地址值,就是该数组的第一个元素的第一个字节的地址。
(2)指针变量有基类型,相当于数组的类型名。
(3)指针变量的地址值不可改变,即指针变量指向的存储单元的地址值是固定的,不可改变,如int *p,a;p=&a;则变量a的地址是不可改变的。也不可给数组名的地址重新赋值。如数组名为a的数组:a=&x;或a++等给数组名重新赋值都是错误的。一旦定义,a永远指向a数组的首地址。
(4)虽然不可改变a的内容(地址),但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。如:
a 代表 &a【0】数组的首地址,也是a[0]的地址 //首地址
a+1 代表 &a【1】数组元素a[1]的地址 //在指针中,1代表一个存储单元
a+2 代表 &a【2】...... //注意:不是a=a+1,而是 a+1
例:
main()
{
int a[10],*p,x,k;
for(k=0;k<10;k++) p=a+k; //a是数组的首地址,p=a+k;则遍历了数组中每个元素
for (k=0;k<10;k++) scanf("%d",a+k); //输入每个元素的值
for (k=0;k<10;k++) printf("%d\n",a[k]); //打印每个元素的值
getch();
}
p=&a[0]; 等价于 p=a;
以下语句等价:
for(p=a,k=0;k<10;k++) p++;//将数组a的首地址赋给指针p,k从0到9,p++将遍历数组中每个元素的地址。依次指向数组 a1,a2,a3......a9.
for(p=a,k=0;k<10;k++){scanf("%d",p);p++;}
for(p=a,k=0;k<10;k++)scanf("%d",p++);//什么 自加自减运算符,当++在后面时,当前表达式的值不变,元素加1.
for(p=a;p-a<10;p++)scanf(“%d”,p);
通过数组首地址 指针 带下标的指针引用一维数组元素。
引用一维数组中的某一个元素的方法:
* :求当前地址的内容 & :求当前内容的地址
1 a【i】
2 *&a【i】 //*在定义语句时代表定义一个指针变量,当在执行语句部分时代表间址运算符,引用一个指针变量指向的地址的内容。&叫求地址运算符,求当前内容的地址。所以*和&就像乘号和除号一样,互相抵消了。
3 *(a+i):在数组名的地址上,加上i个存储单元。代表第(i+1)个元素,用间址运算符引用它,即等价于a[i]
4 当(p=a;||p=&a【0】)则 *(p+i)等价于a[i]
5 当(p=a;||p=&a[0]) 则 p[i] 等价于 a[i] //方括号不仅表示数组元素的记号,也是一种运算符.
总结:引用一维数组元素a[i] 的四种方法: a[i] *(a+i) 若p=a, 则 p[i] *(p+i)
表示a[i]的地址的方法:&a[i] a+i p+i 都表示当前数组第i个元素的地址。
以下代表什么:
*(P--) a[i--] *--p a[--i]
注:自加自减运算,p-- 等价于:m=p-- m=p p=p-1 //先赋值,(先取值)再改变
--p 等价于:m=--p p=p-1 m=p //先改变,再赋值。(再取值)
数组名a和指向数组的指针p的区别.前者不可变,不可运算,后者可以赋值,运算.
a++ 是个赋值表达式
3)逐个输出a数组中元素的值.
for(k=0;k<10;k++) printf("%4d",*(a+k));
for(k=0;k<10;k++) printf("%4d",a[k]);
for(p=a,k=0;k<10;k++) printf("%4d",*(p+k));
for(p=a,k=0;k<10;k++) printf("%4d",p[k]);
for(p=a,k=0;k<10;k++) {printf("%4d",*p);p++} //p++,即依次指向每一个元素。