1、一维数组名
1、一维数组名是个指针常量 2、它存放的是一维数组第一个元素的地址
# include <stdio.h> int main(void) { int a[5]; //a是数组名 5是数组元素的个数 元素就是变量 a[0] -- a[4] // int a[3][4]; //3行4列 a[0][0]是第一个元素 a[i][j]第i+1行j+1列 int b[5]; //a = b;//error a是常量 printf("%#X\n", &a[0]); printf("%#X\n", a); return 0; } /* 在Vc++6.0中的输出结果是: -------------- 0X12FF6C 0X12FF6C Press any key to continue -------------- 总结: 一维数组名 一维数组名是个指针常量 它存放的是一维数组第一个元素的地址 */
2、下标和指针的关系
如果p是个指针变量,则:
p[i]永远等价于 *(p+i)
数组和指针的区别: 数组名确实表示指向数组首地址的指针,但这个指针很特别,它的值(指针的值指的是指针所指的地址)不能被改写,能改写的仅仅是其指向的内容,换句话说,
数组名只能指向数组的首地址,如果有数组char a[];那么如果出现a = a+1;这是编译都通不过的错误。而对于一个普通的指针是可以的,再比如有数组char a[];
那么再定义一个char *p = a;然后再用p = p+1是合法的,这表示让指针p指向&a[1]。 它们的第二个区别是:每当用到数组名这个指针的时候,系统都会传入数组的信息,而普通的指针只是一个4字节的整数,例如: 1. char a[5]; 2. char *p = a;//指针a和指针p都指向数组a的首地址 //数组定义: int a[8] = {1, 2, 3, 4, 5, 6, 7, 8}; //指针定义: int * p; p = &a[0]; // p 指向数组首元素 //指针定义: int * p; p = a; // p 仍指向数组首元素 //指针定义: int * q; q = &a[2]; // q 指向 a[2]
3、确定一个一维数组需要2个参数
# include <stdio.h> //f函数可以输出任何一个一维数组的内容 void f(int * pArr, int len) { int i; for (i=0; i<len; ++i) printf("%d ", *(pArr+i) ); //*pArr *(pArr+1) *(pArr+2) printf("\n"); } int main(void) { int a[5] = {1,2,3,4,5}; int b[6] = {-1,-2,-3,4,5,-6}; int c[100] = {1, 99, 22, 33}; f(a, 5); //a是 int * f(b, 6); f(c, 100); return 0; }
/* 2020年4月5日20:24:51 一定要明白 10行的pArr[3] 和17行 19行的a[3] 是同一个变量 */ # include <stdio.h> void f(int * pArr, int len) { pArr[3] = 88; //10行 } int main(void) { int a[6] = {1,2,3,4,5,6}; printf("%d\n", a[3]); //17行 f(a, 6); printf("%d\n", a[3]); // 19行 return 0; } /* 在Vc++6.0中的输出结果是: --------------------------- 4 88 Press any key to continue --------------------------- */
/* 在f中对pArr[i]进行操作就相当于在main函数中对b[i]进行操作,这也是指针的一个很重要的用法 */ # include <stdio.h> void f(int * pArr, int len) { int i; for (i=0; i<len; ++i) printf("%d ", pArr[i]); //*(pArr+i) 等价于 pArr[i] 也等价于 b[i] 也等价于 *(b+i) printf("\n"); } int main(void) { int b[6] = {-1,-2,-3,4,5,-6}; f(b, 6); return 0; } /*----------------------------------- 打印结果: -1 -2 -3 4 5 -6 Press any key to continue -----------------------------------*/