#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
//上次讲的指针变量指向函数参数
//一.数组的指针和指向数组的指针变量 数组元素的指针就是指数组元素的地址
//int a[5];//能引用的是a[0]~a[4];
//数组指针 是指数组的开始地址
//a[3] = 6; //这是下标法引用数组元素 也可以用指针法一引用数组元素
//只要书数组 那么数组元素的内存一定是挨着的
// a[0] = 5; //四个字节
// a[1] = 6; //都是四个字节
// a[2] = 7;
// a[3] = 8;
// a[4] = 9;
//整个数组的第一个元素的地址就是整个数组的地址
// int *p;//整型变量 整形指针变量 和数组a类型相同
// p = &a[0];//把a[0]的地址付给了指针变量p 即p指向数组第0号元素;
//等价于p = a;数组名代表了首地址
//定义指针变量时 也可以给指针变量赋初值
//int *p = &a[0];
//等价于
// int *p;
// p = &a[0]; //千万不要这么写: *p = &a[0];
//等价于
//int *p = a;
//二.通过指针引用数组元素
//看效果
//a)*p = 19;//相当于a[0] = 19;
//b)
//p = p + 1;p加多少取决于p是什么类型 int型 就加4
//c) p+i 或者 a+i是啥意思(i是数组元素的下标0--4)
//假如现在p指向数组首地址 a是数组名(数组首地址) p+i或者a+i就是数组元素a[i]的地址
//也就是说指向了数组a的第i个元素
//也就是说 p+3 和 a+3 的就是 &a[3] 第三个元素的地址值 a + i*4 a[0] =1000 则a[3] = 1012;
//结论:p+i或者a+i都是地址值 既然是地址,就可以复制给指针变量
// *p = 19; //a[0] = 19;
// p = a+3; //地址值加三
// *p = 13; //a[3] = 13;
//d) *(p+i)或者*(a+i)
//有了C自然知道d了 这两个p+i和a+i多指向的数组元素 也就是a[i]
//比如说a[i],比如说*(a+2) 或者说 *(p+2)就是a[2]
//*(p+3) = 18;//a[3] = 18;
//e) p[i] (i是数组下标0--4)
//p[i] 与 *(p+i)是等价的
//p[3] = 156; <=> a[3] = 156;
//引用数组元素总结:
//a[i]; p[i]; *(p+i); *(a+i); 都是等价的
int a[5];//能引用a[0] - a[4];
int *p;
int i;
a[0] = 12;
a[1] = 14;
a[2] = 20;
a[3] = 18;
a[4] = 50;
for(i = 0;i < 5;i++){
printf("%d\n",a[i]);
}
printf("==============\n");
for(i = 0;i < 5;i++){
printf("%d\n",*(a+i));
}
printf("==============\n");
for(p=a;p<(a+5);p++){
printf("%d\n",*p);
}
//注意事项:
//1
//a++; 数组首地址++ 没什么意义
//a[5]也是有的 但是没有使用权 按照*(a+5)是有的
//f) *p++:优先级相同 并且都是从右到左的结合性 所以等价于 *(p++)
//p++ 先用后加
//*(p++):就是先得到p指向的变量的值(*p) 再将p指针自加一就是指向下一个数组元素
//printf("%d\n",*p++);//也就是先打印a[0]的值 然后p指向了a[1];
//g)*++p;//p先自加,求下一个地址值的值
//printf("%d\n",*++p);//就是说这个打印的就是a[1]的值
//h) (*p)++; p指向的元素加一,如果p指向的数组首地址,那么就等价于a[0]+1;
}
C语言指针数组
最新推荐文章于 2025-06-16 17:19:44 发布