您的位置:首页 > 编程语言 > C语言/C++

【C++ Primer】第4章 数组和指针

2013-08-02 18:20 330 查看

第4章 数组和指针

数组

数组的长度是固定的
数组是由类型名、标识符和维数组成的符合数据类型,除了引用之外,数组元素可以是任意的类型
数组的维数必须用值大于等于1的常量表达式定义:整形字面常量、枚举类型,或用常量表达式初始化的整型const对象
非const变量和直到运行期才知道其值的const变量都不能用作定义数组的维数
在函数体外定义的内置数组,元素初始化为0,函数体内定义的内置数组,元素无初始化
无论在哪里定义,如果元素是类类型,则自动调用默认的构造函数进行初始化,如果没有默认构造函数,则必须为该数组提供显式初始化
字符数组末尾没有空字符,字符串字面值包含一个额外的空字符。使用字符串来初始化新数组,末尾会加入空字符
char cal1[] = {'C', '+', '+'} //no null
char cal2[] = "C++" //null terminator added automatically
不允许数组直接复制和赋值
数组下标的正确类型是size_t

指针

取地址操作符&只能用于左值
理解指针声明语句时,从右向左读
对指针进行初始化或赋值只能使用以下四种类型的值

Ø 0值常量表达式

Ø 类型匹配的对象的地址

Ø 另一对象之后的下一地址

Ø 同类型的另一个有效指针
int zero = 0;
const int c_ival = 0;
int *pi = zero; //error, pi assigned int value of zero
int *pi = c_ival; //ok, c_ival is const with compile-time value of 0
void*指针可以保存任何类型对象的地址,它表明该指针与一地址值相关,但是不清楚存储在此地址上的对象的类型
void*指针只支持几种操作:与另一指针的比较,向函数传递或返回void*指针,给另一void*指针赋值。不允许使用void*指针操作它指向的对象
C++允许计算数组或对象的超出末端的地址,但不允许对此地址解引用
     string s = "123";

     cout << s[10] << endl;

     cout << &(s[10]) << endl; // 在VC6.0,这两个好像都可以
指针是数组的迭代器
指向const对象的指针必须具有const特性,const double *cptr;  cptr是一个指向double类型const对象的指针,它指向的对象不可变,但cptr可变
把一个const对象的地址赋给一个普通的、非const对象的指针也会导致编译器错误
     const int a = 1;

     int* p = &a;
error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'

不能使用void*指针保存const对象的地址,但const void*可以
允许把非const对象的指针赋给指向const对象的指针
dval = 3.14;
*cptr = 3.14; // error
double *ptr = &dval;
*ptr = 2.72
cout<<*cptr; // prints 2.72
不能保证指向const指针所指对象的值一定不可修改,将const指针理解为“自以为指向const的指针”
Attention:typedef不是文本扩展!

C风格字符串

char ca[] = {'C', '+', '+'};
cout<< strlen(ca)<<endl;
strlen会从实参ca指向的内存空间开始搜索,知道遇到null为止,返回中间这段内存的字符个数

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: