C++重点

数组与指针

指针

把指针当作一种数据类型,存放的是地址。比如int* p,p是指针变量,赋值为p = &a
*运算符被称为间接值或解除引用(解引用)运算符。

用const修饰指针

1)常量指针

语法:const 数据类型 *变量名;
不能通过解引用的方法修改内存地址中的值(用原始的变量名是可以修改的)。

注意
 指向的变量(对象)可以改变(之前是指向变量a的,后来可以改为指向变量b)。
 一般用于修饰函数的形参,表示不希望在函数里修改内存地址中的值。
也就是说可以改变指向,但是指向的地址里面的值不能改变。

2)指针常量

语法:数据类型 * const 变量名;
指向的变量(对象)不可改变。

 在定义的同时必须初始化,否则没有意义。
 可以通过解引用的方法修改内存地址中的值。

3)常指针常量

语法:const 数据类型 * const 变量名;
指向的变量(对象)不可改变,不能通过解引用的方法修改内存地址中的值。

数组

一维数组

数组第n个元素的地址是:数组首地址+n
C++编译器把 数组名[下标] 解释为 *(数组首地址+下标)

a的地址+1是:(void*)( & a + 1)
将指针变量(地址的值)加1后,增加的量等于它指向的数据类型的字节数。

数组指针

本质是指针,数组的指针,即指向数组的指针。

char (*pa)[4];

pa是一个指针指向一个char [4]的数组,每个数组元素是一个char类型的变量。
a是pa指向的数组,用a可以直接表示数组的首元素首地址即&a[0],&a才能表示整个数组的地址,所以a+1是数组第2个元素的地址,而&a+1是到了数组的末尾,即下一个数组的首地址。 所以应该用&a给pa赋值。在数组里面,用char *p =a;也是可以的,但是注意a表示的是数组首元素的地址。

总结

a+i= & a[i]  = &a[0] + i = p+i    得到的都是地址,前面加 * 得到都是具体地址里的值。
&a+1  下一个数组首地址

指针数组

本质是数组,指针的数组,数组里面每个元素都是指针。


char *arr[4] = {"hello", "world", "shannxi", "xian"};

指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址
int main(int argc, char *argv[])
不能传递整个数组过去,如果数组很大,这样内存利用率很低,所以应该传递数组的首地址,用一个指针接收这个地址。

注意
数组名和指针名可以交换互用
int* p = (int *)a; // 让整型指针p指向数组a的内存。(int *)a也可以表示内存,此时p[i]等价于a[i] ,数组名和指针名感觉可以互用

数组和指针的区别
数组是固定大小,不允许更改,而指针可以更改。数组名是常量指针,指针是变量指针。
当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而是代表整个数组。而指针仍当成指向一个元素的变量指针来使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值