C学习-基础:指针与一维数组、二维数组
数组名
一个数组的元素在内存中是连续存放的,数组第一个元素的地址称数组的首地址。C语言中,数组名是该数组的首地址。
例如有以下定义语句:
int a[10],*p;
则语句 p=a;和 p=&a[0];是等价的,都表示指针变量p指向a数组的首地址。
数组首地址的值是一个地址常量,是不能改变的。因此,语句 a=p; 或a++;都是非法的。但是p是地址变量,可以进行++等操作。
指针与一维数组
1. 通过一维数组名存取数组元素
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; char str[10] = {"Chinese"}; printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3)); *(str + 3) = 'q'; // str+3 与 str[3] 等价 printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3)); scanf("%d", &waitag); return 0; }
结果为
改变前原数组为:Chinese 第三个元素变为:n 改变第三个元素:Chiqese 第三个元素变为:q
假设有一维数组a,可知a+i是元素a[i]的地址,根据指针运算符“*”的运算规则可知 *(a+i) 与元素 a[i]等价。
2. 通过指针运算符“*”存取数组元素
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; char str[10] = {"Chinese"},*p; p=str; printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3)); *(p + 3) = 'q'; // 通过 指针运算符 存取数组元素 printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3)); scanf("%d", &waitag); return 0; }
结果为
改变前原数组为:Chinese 第三个元素变为:n 改变第三个元素:Chiqese 第三个元素变为:q
假设有一维数组a,即p指向a数组的首地址,可知p+i是元素a[i]的地址,根据指针运算符“*”的运算规则知 *(p+i) 与元素 a[i]等价。
3、通过带下标的指针变量存取数组元素
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; char str[10] = {"Chinese"},*p; p=str; printf("改变前原数组为:%s\n第三个元素变为:%c\n", str, *(str + 3)); p[3] = 'q'; //通过 带下标的 指针变量 printf("改变第三个元素:%s\n第三个元素变为:%c\n", str, *(str + 3)); scanf("%d", &waitag); return 0; }
结果为
改变前原数组为:Chinese 第三个元素变为:n 改变第三个元素:Chiqese 第三个元素变为:q
C语言中的下标运算符“[ ]”可以构成表达式,假设p为指针变量,i为整型表达式,则可以把p[i]看成是表达式,首先按p+i计算地址,然后再存取此地址单元中的值。因此p[i]与*(p+i)等价。
指针与二维数组
二维数组由一维数组扩展形成,可以理解为特殊的一维数组。即一维数组的每一个元素作为数组名形成一行数组,各行数组的元素个数相同,叫元素个数为二维数组的列数。
(1) 指向数组元素的指针变量是一级指针变量:将二维数组当成一维数组访问。
(2) 指向一维数组的指针变量是 行指针变量
(2) 指向指针的指针变量是二级指针变量
指向一维数组的行指针变量
类型 (*指针变量名)[一维数组元素个数];
int a[3][4], (*prt)[4]; prt=a;
考虑其中的(*prt)[4],因为( )和[ ]的优先级相同,*prt表示prt应为指针变量,它指向一个含有4个元素的一维整型数组,而不是指向一个元素,因此它是二级指针变量(行指针变量),可以移动。
int (*prt)[4]:表示它指向一个含有4个元素的一维整型数组;用于二维数组
int *prt[4]:表示它是一个包含4个指向整型类型的指针变量的指针数组;用于一维数组
例子:
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; printf("指针引用一维数组 *p[2]\n"); char t, b[2] = {'a', 'b'}, *p[2]; //*p[2]表示含有两个指向整型类型的指针变量的指针数组,like {*x,*y} for (t = 0; t < 2; t++) { p[t] = &b[t]; printf("%c\n", *p[t]); } printf("\n指针引用二维数组 (*prt)[2]\n"); int i, j; int a[3][2] = {1, 2, 3, 4, 5, 6}, (*prt)[2]; //(*prt)[2]表示指向一个含有2个元素的一维整型数组 prt = a; for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { printf("%d\n", prt[i][j]); } } scanf("%d", &waitag); return 0; }
输出:
指针引用一维数组 *p[2] a b 指针引用二维数组 (*prt)[2] 1 2 3 4 5 6
共 0 条评论