C++中的指针与数组

最近在使用数组做为函数参数时遇到一些自己没接触过的写法,查了相关资料后记录一下。

 首先说一下数组与指针,C++ primer中提到,在C++现代使用中,尽量使用容器和迭代器,避免使用低级的数组和指针,除非在强调速度是才使用。

数组:

 对于数组,可以简单的理解为是一个常量指针标识(数组名)+变量的集合(数组值)。除此之外,数组还有一些其他属性,深入的理解,可以把数组当做一个完备的变量类型,包括有名称,大小及地址等属性。举个例子,如下代码:

int data1[]={1,2,3,4,5};
int size1=sizeof(data1);
int *data2=data1;
int size2=sizeof(data2);
    输出的结果是,size1=20,size2=4;

    sizeof(data1)求的是data1数组的大小,sizeof(data2)求的则是指针的大小。

指针:

指针是一个特殊的变量,它里面存储的数值是一个地址。对于指针,需要搞懂以下几点:1,指针本身的类型,2,指针所

指向的类型,3,指针本身的值,4,指针所占的内存。

1.指针本身的类型在定义指针时确定,也可以在具体使用时进行强制转换。

	int *p=NULL;       int型的指针
	char *p=NULL;      char型的指针
	int (*p)[10];      int (*)[10]型指针,是一个二维指针
	int *p[10];        int型指针,共有10个
      2.上述定义很容易看出指针的类型是什么,需要注意的是第3行,定义了一个二维数组指针,二维数组的列数为10,。第4行则定义了一个数组,数组中的每个元素都是一个int型指针。

      3.指针所指向的类型需要与指针的类型一致,否则会在编译的时候报错。类型一致非常重要,根据使用情况可以进行强制类型转换,这点会在后边介绍。

      4.指针本身的值是一个地址,在32位系统中,指针占4个字节。注意,指针所占的内存指的是存储指针所需的空间,也可以理解为存储一个地址变量所需的空间,通常在系统中,一个地址变量是用4个字节来表示的。进一步,可以理解为,指针本身就是一个int型的变量。这句话需要好好理解下!!!!!!。指针本身的值是一个地址,这个地址占4个字节。

注意:指针类型的作用

     我们知道了不同类型的指针变量指向不同类型的对象,这些指针变量结合指针运算符(*)就等价于指向的对象的值,但我们又知道所有的指针变量的类型都是一样的(都是int型)。到底声明不同类型的指针变量的背后是什么?其实声明不同类型的指针变量既是规定了该变量结合指针运算符时读取内存中的字节数,同样在指针移动和指针的运算时(加、减)在内存中移动的最小字节数。

可以这样理解,指针的类型是一种规则,定义了在进行p++,p--时移动多少个字节。配合代码理解:

     int num[5]={0,1,2,3,4};
    char str[5]={'a','b','c','d','e'};
    int *p1=num;
    char *p2=str;
    cout<<sizeof(p1)<<' '<<sizeof(p2)<<endl;
    printf("Address:p1   %x,p2    %x\n",p1,p2);
    printf("Address:p1+1 %x,p2+1  %x\n",p1+1,p2+1);

     定义两个指针p1,p2,分别指向int型数组num和char型数组str,对两个指针求占用的内存大小,值为4.对int型指针p1做加1处理时,可以看到,指针移动的字节数为4,而对char型指针做加1处理时,指针移动的字节数为1.这就是指针类型的作用。可以想像,如果用int型指针指向char型数组,则每次指针加1将会移动4个字节,而char型数组在内存中是连续排列的,这会造成越过3个字节。在进行*p时,也跟类型有关,char型指针在*p时读取的是一个字节中的数据,而int型指针在*p是是将对应4个字节的值组合起来。

     而针对前文提到的指针类型强制转换,此时大家应该能理解,指针类型强制转换不会影响指针存储的值(地址变量),改变的只是在进行p++,p--,以及*p时对应的规则而已。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值