指针与数组
数组的本质是一片连续的内存
- 使用取地址操作符&获取数组的地址
- 数组名可以看作一个小指针,代表数组中0元素的地址
- 当指针指向数组元素时,可以进行指针运算(指针移动)
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,0};//定义一个5元素数组
int* p = a;//定义指针,指向数组中0号元素
//数组名可以被看作一个指针 即 0 号元素的地址 即:a <==> &a[0]
printf("%p,%p\n", p, a);
p++;// p = p + 1 ;指针移动
*p = 100;//对数组中一号元素赋值 即a[1] = 100;
printf("%d ,%d\n", *p, a[1]);
printf("%p ,%p\n", &a, a);
/*
&a 和 a在地址数值上相同,但意义不同
&a 代表数组地址,类型为: int(*)[5]
a 代表数组0号元素的地址,类型为: int*
*p代表数组0号元素地址, 类型为:int*
*/
return 0;
}
指向数组的指针
定义语句:*int( pName)[5]=&a
含义:定义了一个指针,名字为pName,a为数组,即用数组地址来初始化pName
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,0 };
int(*pa)[5] = &a;
int* p = a;
printf("%p,%p\n", pa, p);
//&a与a类型不同 故不可以相互赋值
//pa = p; //WARNING!
while (*p)
//*p指向int a[0]、a[1]、a[2]、a[3]、a[4]
//随着p++的移动 当p指向a[4] 即p = 0时循环结束
{
printf("%d\n", *p);
p++;
}
/*
输出:1
2
3
4
*/
return 0;
}