c语言指针与数组的一些小总结
- 在c语言中,数组名(不包括形参数组名)代表数组中首元素的地址
#include"stdio.h"
int main()
{
int *b,a[10]={1,2}; //定义一个指向int的指针b。
b=a; // 把a[0]的地址赋值给指针变量b。相当于b=&a[0];
printf("%d",*b); //输出为a[0]的值1。
}
- 在一定条件下指针可进行加减运算。
#include"stdio.h"
int main()
{
int *b,a[10]={0,1,2,3,4,5,6,7,8,9};
b=&a[5]; //将a[5]的地址赋给指针变量b
printf("%d\n",*(b+1)); //*(b+1)即a[6]的值。
printf("%d\n",*(b-3)); // *(b-3)相当于a[2]
}
3.用指针变量指向元素数组
#include"stdio.h"
int main()
{
int *b,a[10];
for(b=a;b<a+10;b++) //开始时把a[0]的地址赋给指针变量b。
scanf("%d",b);
for(b=a;b<a+10;b++) //这里必须重新赋&a[0]给b,否则b为a[9]的地址。
printf("%d\t",*b);
}
#include"stdio.h"
int main()
{
int *b,a[10],i;
fAor(i=0;i<10;i++)
scanf("%d",a+i);
for(i=0;i<10;i++)
printf("%d\t",*(a+i)); //*(a+i) 相当于a[i]
}
以 *b 输出的速度高于比 *(a+i) 或 a[i]。
注意:以如下方式进行for循环是错误的
for(b=a;a<b+10;a++) //这一行报错
printf("%d",*a);
a是一个指针型常量。它的值在程序运行期间是固定不变的。
4.当指针变量指向数组元素时指针变量可以带下标。
#include"stdio.h"
int main()
{
int *b,i,a[10]={0,1,2,3,4,5,6,7,8,9};
b=a; //把a[0]的地址赋给指针变量b,这是b[i]==a[i]的前提。
for(i=0;i<10;i++)
printf("%d\t",b[i]); //输出a[i]的值。
/* 此时有 b[i]==a[i]==*(b+i)==*(a+i) */
}
5.指针运算易混淆的几个表达式
首先需明白
++ 和 * 是同优先级,方向是从右往左读。
#include"stdio.h"
int main()
{
int *b,a[10]={0,1,2,3,4,5,6,7,8,9};
b=a+3; //把a[3]的地址赋给指针变量b。
printf("%d",*b++); //指针变量b先进行“* ”运算,再让指针变量加 1。
// 即输出 a[3] 的值 3 。然后让b加 1。
printf("%d",*++b); //指针变量此时为&a[4] 先让指针变量加 1 为 a[5] 的地址 ,再做“* ”运算。
// 即 a[5]的值 5
printf("%d",++*b); //次时b为a[5]的地址,先做“* ”运算再让元素值加 1。
// 即 a[5]+1的值 6.
}