#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void main()
{
int i = 0;
int a;
int *p = NULL;
//arr代表数组首元素的地址(不是整个数组的地址,虽然二者值一样),arr是个指针常量
//变量---》指针变量-----》常量指针变量(常量指针)
//不能被随便的改变指针变量的值(不能随便的改变指针的指向)相当于int func(int * const arr)
//为啥arr是个const?
//答:在定义arr[5]时,编译器分配内存,为了让编译器防止在释放内存时找不到所释放数组地址,编译器就把arr定义为const量。
//不能深入理解c指针是产生bug的根源。
int arr[5] = { 1,3,65,6,7 };
//arr=0x11 ;编译不了,无法改变指针变量的值。
typedef int(MYArr5)[5];
//给数组指针赋值需要。。。。。&arr
MYArr5 *pArray=&arr;
for (i = 0; i < 5; i++)
{
//arr[i] = i;
//(*pArray)[i] = i;
// printf("%d \n", arr[i]);
printf("%d \n", (*pArray)[i]);
}
//相当于定义了一个数组指针
//多用如下定义数组指针:
int c[5] = { 1,3,65,6,7 };
int(*myp)[5] = &c; //定义一个指向数组的指针变量。
for (i = 0; i < 5; i++)
{
printf("%d \n", (*myp)[i]);
//注意数组指针中对数组中元素调用的语法:(*myp)[i]。
}
system("pause");
}
此处有个易混点:
char *p[i]:是指针数组,即元素为地址的数组,p是指针变量,p[i]为各元素的值,亦即地址值。一般用于做关键字菜单,或main函数的命令行参数。
char (*myp)[i]:是数组指针,即(指向类型为数组的内存块的)指针,myp是指针变量,myp的值为数组的首地址,(*myp)[i] 取此数组首地址的内存块的第i个元素。
char (*myp)[i] 可以从运算符优先级角度理解,可以看做先有(*myp),后有[30],所以可以认为是先有指针myp,然后i表示myp+1的步长是i个char的大小。