一维数据与指针

1.一维数组的原理

1.数组名的真正作用:数组整个储存空间的首地址,也代表第0个元素的地址.

(1)找到地址(可以用数组名+偏移量,或者是取地址符完成)

#include <iostream>
using namespace std;
int main()
{
  int a[]={10,20,30,40,50};
  printf("%p %p %p\n",a,a+1,a+2);
  printf("%p %p %p\n",&a[0],&a[1],&a[2]);
  return 0;
}

(2)得到空间

#include <iostream>
using namespace std;
int main()
{
  int a[]={10,20,30,40,50};
  printf("%d %d %d\n",*a,*(a+1),*(a+2));
  printf("%d %d %d\n",a[0],a[1],a[2]);
  return 0;
}

由此可总结,两种找到地址和得到空间的方式实际是等价的。

深度挖掘:[]是一种运算符,参考地址[偏移]==*(参考地址+偏移量)。

所以as[3]和[3]as甚至等价,因为本质上都等于*(as+3)。

2.指针与一维数组某元素

(1)int型指针指向int型数组的意义

int*p=a:因为p=&a[0]. 所以p=&*(a+0)。

(2)比较指针p+1和数组名a+1的区别

p++ //p是指针变量

a++ //a是指针(地址)常量,不可被修改。

深度理解:数组名(地址常量)不可改变代表不可以自加,自减。*(a+1)中a并没有改变,可以这样使用。

但是不可以将已经开辟好的内存空间的地址改变。

(3)数组[下标]与*(指针+移动)与指针[下标]的实际应用--遍历数组

#include <iostream>
using namespace std;
int main()
{
  int a[]={10,20,30,40,50};
  for(int i=0;i<5;i++)
  {
    printf("%d %d %d %d\n",a[i],*(a+i),*(p+i),p[i]);
  }
  return 0;
}

3.指针类型的数组(指针数组)

int arr[]={1,2,3,4,5} 这是一个整型数组,其中的元素都是整数。

int * pa[]={ &a , arr , arr+1 , &arr[0] } 这是一个指针类型的数组(指针数组),其中的元素都是指针。

下面的例子可以帮助理解这个概念

#include <iostream>
using namespace std;
int main()
{
  int a=1,b=2,c=3,d=4;
  int arr[]={7,8,9,10};
  int *pa[]={&a,arr,arr+1,&arr[0]};
  for(int i=0;i<4;i++)
  {
      printf("%p %d\n",pa[i],*pa[i]); 
  }
  return 0;
}

指针数组----找到地址 加星号----得到空间

4.指向一维数组的指针(数组指针)

int* x, //指向一个整数的指针 (士兵)

int(*m)[4]; //指向一个一维数组的指针 (百夫长)

int(*n)[3][4]; //指向一个二维数组的指针 (将军)

如何给数组指针赋值:

arr为元素间的偏移,&arr是整体数组的偏移

深刻理解:

首先注意:arr(数组名)只有在sizeof()中和&后才能表示整个数组类型的首地址,其余认作是0号元素的地址

arr:代表数组类型,因为其中有4(n)个int型的元素,所以该类型内存空间为16(4*n)。

*arr(元素):得到数组0号元素的空间,得到了0号元素“1”,且内存空间为4.

&arr(指向数组类型的指针变量):找到整个数组类型的地址,且内存空间为4.

*&arr:代表数组类型,因为其中有4(n)个int型的元素,所以该类型内存空间为16(4*n)。

由此可以更加深刻的理解arr和&arr的关系。

全部评论

相关推荐

点赞 评论 收藏
分享
01-14 15:08
东南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务