指针的问题4 不一样的数组指针
2015-07-16 19:54
246 查看
一般来讲,说道指针和数组都会想到类似于这样的小程序:
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
int *p=&a[0];
printf("%d\n",*(p+1));
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————下面解释一下几样东西:
1、数组类型
之前学习常量的时候会有数据类型比如是整型浮点型之类的,数组也一样,也是有类型的。数组类型主要包括两个部分:①内存空间的大小;②数据的解释
比如从理论上讲int[4]就是数组类型,代表了占四个字节的整型数组。数组类型加上数组名就变成了数组的定义。
2、对数组名取地址
对数组名取地址,地址的值不改变,但类型变为指向整个数组的地址(或指针)。
举个例子:
int a[4]={1,2,3,4};
a表示的是数组的首地址,指向的是数组的第一个元素;
&a表示的虽然也是首地址,但是指向的确实整个数组。
也就是说:
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
int *p=&a;
printf("%x %x\n",a,&a);
return 0;
}
运行后的结果为
可以看出a与 &a的地址是一样的。但是a+1与&a+1并不一样:
输入一下程序运行可看出:
&a是偏移了整整一个数组,而a仅仅只是移动了一个元素而已。
通过上面的简单说明下面开始讲数组指针(这里讲的是将数组名地址给指针的情况):
首先定义指针:
int a [4]={1,2,3,4};
(理论上讲应该这样定义指针) int [4]*ptr = &a;
但是规定上并不允许这样做,通过交换位置可以这样定义:int (*ptr)[4]=&a;
(注意:这里的括号是不能省略的)
那么通过编程实验可以得到下面的等式:
(*ptr)
= *((*ptr)+n) = a
;
当 n = 0的时候有:(*ptr)[0] = *((*ptr)+0) = a[0] = **ptr;
可以这么说,这里的指针是以(*ptr)存在的,当去掉括号,等式将不会成立。
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
int *p=&a[0];
printf("%d\n",*(p+1));
return 0;
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————下面解释一下几样东西:
1、数组类型
之前学习常量的时候会有数据类型比如是整型浮点型之类的,数组也一样,也是有类型的。数组类型主要包括两个部分:①内存空间的大小;②数据的解释
比如从理论上讲int[4]就是数组类型,代表了占四个字节的整型数组。数组类型加上数组名就变成了数组的定义。
2、对数组名取地址
对数组名取地址,地址的值不改变,但类型变为指向整个数组的地址(或指针)。
举个例子:
int a[4]={1,2,3,4};
a表示的是数组的首地址,指向的是数组的第一个元素;
&a表示的虽然也是首地址,但是指向的确实整个数组。
也就是说:
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
int *p=&a;
printf("%x %x\n",a,&a);
return 0;
}
运行后的结果为
可以看出a与 &a的地址是一样的。但是a+1与&a+1并不一样:
输入一下程序运行可看出:
&a是偏移了整整一个数组,而a仅仅只是移动了一个元素而已。
通过上面的简单说明下面开始讲数组指针(这里讲的是将数组名地址给指针的情况):
首先定义指针:
int a [4]={1,2,3,4};
(理论上讲应该这样定义指针) int [4]*ptr = &a;
但是规定上并不允许这样做,通过交换位置可以这样定义:int (*ptr)[4]=&a;
(注意:这里的括号是不能省略的)
那么通过编程实验可以得到下面的等式:
(*ptr)
= *((*ptr)+n) = a
;
当 n = 0的时候有:(*ptr)[0] = *((*ptr)+0) = a[0] = **ptr;
可以这么说,这里的指针是以(*ptr)存在的,当去掉括号,等式将不会成立。
相关文章推荐
- 关于指针的一些事情
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C# Pointer指针应用实例简述
- Ruby简明教程之数组和Hash介绍
- C语言查找数组里数字重复次数的方法
- C++智能指针实例详解
- C语言柔性数组实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- Perl中怎样从数组中删除某个值?