数组和指针

数组
1.数组的定义和初始化
数组的维数必须用值大于等于1的常量表达式定义,此常量表达式只能包含整形字面值常量,枚举常量或者用常量表达式初始化的整形const对象。非const变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数。
数组的初始化
int a[3]={1,2,4}
如果没有显式提供元素初值,则数组元素会象普通变量一样初始化
.在函数体外定义的内置数组,其元素均初始化为0
.在函数体内定义的内置数组,其元素无初始化
.不管数组在哪里定义,如果其元素类型是类类型,则自动调用该类的默认构造函数进行初始化,如果没有默认构造函数,则必须为该数组的元素提供显式初始化。
显式初始化的数组不需要指定数组的维数值。
int a[]={1,2,3}
如果指定数组维数,那么初始化列表提供的元素个数不能超过维数值。如果维数值大于列出的元素初值个数,则指初始化前面的数组元素。剩下的其他元素,若是内置类型则初始化为0,若是类类型,则调用该类的默认构造函数初始化。
2.特殊的字符数组
字符数组既可以用一组花括号括起来,逗号隔开的字符面值进行初始化,也可以用一个字符串面值进行初始化。注意,这两种初始化形式并不完全相同,字符串字面值包含一个额外的空字符用于结束字符串。当使用字符串字面值来初始化创建的新数组时,将在新数组中加入空字符。
3.不允许数组直接复制和赋值
指针
理解指针声明语句时,从右往左阅读
指针可能的取值的取值
1.保存一个特定对象的地址 int *pi=&val
2.指向某个对象后面的另一个对象int *pi2=0;
3.0值
避免使用未初始化的指针
void* 指针
可以保存任意类型对象的地址
不允许使用void*指针操纵它所指向的对象
指针操引用操作符
string s("aa");
string *sp=&s;
cout<<*sp;解引用操作
*sp="goodbye";
string s2="bb";
sp=&s2;

1.生成左值的解引用操作
给指针直接赋值即可修改指针的值-不需要对指针进行解
引用
2.指针和引用的比较
虽然使用引用和指针都可间接访问另一个值。两者之间有两个重要区别。第一个区别在于引用总是指向某个对象;定义引用时没有初始化是错误的。第二个区别是赋值行为的差异:给引用赋值修改的是该引用所关联的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象。
int a=2l,b=3;
int *pi=&a,*pi2=&b;
pi=pi2;
//引用
int &ri=a,&ri2=b;
ri=ri2;
注意+,解引用操作的优先级不同。


3.指向指针的指针
指针本身也是可用指针指向的内存对象。指针占用内存空间存放值。
使用指针访问数组元素
自动指向数组的第一个元素
给指针加一个整数值,其结果仍是指针。允许直接进行解引用操作,而不必先把它赋给一个新指针。
指针输出数组元素
指针和const限定符
1.指向const对象的指针
使用指针来修改其所指对象的值。但是如果指针指向const对象,则不允许用指针来修改所指const值。C++强制要求指向const对象的指针也必须具有const特性
const double *cptr;
2.const指针
C风格字符串
以空字符NULL结束的字符数组。
1.C风格字符串的使用
C++通过(const)char*类型的指针操纵C风格字符串。
const char *cp="some value";
while(*cp)
{
++cp;
}
2.C风格字符串的标准库
cstring是string.h头文件的C++版本,string.h则是C语言提供的标准库。
strlen(s) 返回s的长度,不包括字符串结束符NULL
strcmp(s1,s2)比较两个字符串是否相同
strcat(s1,,s2)将字符串s2连接到s1后,并返回s1
strcpy(s1,s2)将s2复制给s1,并返回s1
strncat(s1,s2,n)将s2的前n个字符连接到s1后面,并返回s1
strncpy(s1,s2,n)将s2的前n个字符复制给s1,并返回s1
3.永远不要忘记字符串结束符null
处理C风格字符串的标准库函数时,必须字符串以结束符null结束。
4.调用者必须确保目标字符串具有足够的大小。
5.使用strlen函数处理C风格字符串
动态创建数组
1.动态数组的定义
动态分配数组时,只需指定类型和数组长度,不必为数组对象命名。
2.动态数组的赋值
int *pa=new  int [10];
int *pa=new int[10]();//()是初始化的值,本例中即把数组元素都设置为0。
对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的值。
3.const对象的动态数组
如果我们在自由存储区创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化。因为数组元素是const对象,无法赋值。只能对数组初始化。
//C++允许定义类类型的const数组,但该类类型必须提供默认构造函数。
4.允许动态分配空数组
size-t n=getsize();
int *p=new int[n];
for(int *q=p;q!=p+n;++q)
5.动态空间的释放
delete[] pia

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值