C语言—指针与数组

指针与数组

  • 作为初学者的我经常搞不清指针和数组的关系,单独理解数组就是一组相同类型元素的集合,单独理解指针就是用来存放地址的变量,两者表面上看起来并没有什么联系,实际上也确实没有!但为什么应用在实例中,会使我无从选择?下面我将对数组和指针进行辨别和总结:

1、指针

int *p=NULL 表示定义了一个指针变量p,其指向的内存里面保存的是int型的数据,同时将p的值设置为0x00000000;
int *p;*p=NULL; 表示定义了一个指针变量p,指向的内存里面保存的是int型的数据,但p的值不得而知,也意味着p保存的可能是一个非法的地址。此时给*p赋值为NULL,即给p指向的内存赋为NULL,编译时系统可能会报错,因此不能这样初始化指针。
int i=10; int *p=&i; *p=NULL; 这样可以将变量i从10改为0;

如何将数值存储到指定的内存地址
假设往内存0x12ff7c地址存入一个整型数0x100:
int p=(int )0x12ff7c; //内存地址的本质就是指针
*p=0x100;
也可以直接写为:(int)0x12ff7c=0x100;//将地址先进行强制类型转换,在用“*”向这块内存写入一个数据;

2、数组

int a[5]; 定义该数组,编译器根据指定元素的个数和元素的类型分配确定大小20(类型大小*元素个数)的一块内存,并将该内存命名为a,内含a[0],a[1],a[2],a[3],a[4]五个元素;
sizeof(a)的值为sizeof(int)*5,32位系统下为20;
sizeof(a[0])的值为sizeof(int),32位系统下为4;
sizeof(a[5])并不存在,验证其值在为32位系统下也为4,原因是sizeof为关键字,其求值在编译的时候,这里求a[5]的大小时并没有真正的访问a[5],仅仅通过数组元素的类型来确定其值。
sizeof(&a[0]) 的值在32位系统下为4;(取元素a[0]的首地址)
sizeof(&a)的值在32位系统下也为4;(取数组a的首地址)
注意:a不能作为左值,当作为作值时编译器会认为数组名作为左值代表a的首元素的首地址,但这个地址开始的一块内存是一个总体,无法把数组当作一个总体去访问。a[i]可以当左值。

3、指针与数组

以指针的形式和以数组的形式访问:

char *p=“abcdef”;
char a[]="abcdef";
1).以指针的形式访问指针:
*(p+4) //表示先取出p里存储的地址值,给该地址加上4个字符的偏移量,得到第四个字符的地址,取出该地址的值。
2).以下标的形式访问指针:
p[4] //编译器总是把以下标的形式的操作解析为以指针的形式的操作,本质上与以指针的形式访问没有区别。
3).以指针的形式访问数组:
*(a+4) //a表示数组首元素的首地址,给该地址加上4个字符的偏移量,得到新地址,然后取出该地址的值。
4).以下标的形式访问数组:
a[4] //编译器总是把以下标的形式的操作解析为以指针的形式的操作,a代表数组首元素的首地址,给该地址加上4个字符的偏移量,得到新地址,然后取出该地址的值。
总结:数组和指针是完全不同的。

4、指针数组与数组指针

(1)、指针数组:存储指针的数组,首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。
int p1[10] // “[]”的优先级比“ ”高,所以p1先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰上数组的内容,即10个指向int类型数据的指针。
(2)、数组指针:指向数组的指针,首先它是一个指针,指向一个数组。
int (p2)[10] //“()”的优先级比“[]”高,所以p2先与” “结合,构成一个指针的定义,指针变量名为p2,int修饰数组的每一个元素。也可以定义为 int ( * )[10] p2。

5、函数指针

顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。
例如:char (*fun1)(char p1,char * p2); //fun1为一个指针变量,指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。

6、函数指针数组

例如:char ( *p2[10])(char p); // 它是一个数组,数组名为p2,数组内存了10个指向函数的指针。这些指针指向一些返回值类型为字符的指针、参数为一个指向字符的指针的函数。

7、函数指针数组的指针

例如:char (p3)[10])(char *p);//这里p3为一个指针,指向包含了10个元素的一个数组,这个数组里存放指向函数的指针,这些只I帧指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值