数组与指针
数组初始化
- 在函数体外定义的内置数组类型,元素初始化为0;
- 在函数体内定义的内置数组类型,元素都未初始化。
int minList[5];//在函数体外定义的数组
//主函数中显示结果
int maxList[5] ;//函数体内定义的数组
for (int i = 0; i < 5; i++)
{
cout << maxList[i] << " ";
}
cout << endl;
for (int i = 0; i < 5; i++)
{
cout << minList[i] << " ";
}
字符数组
//字符串数组
char id[] = {'2','0','1','5',NULL};//在使用时一定要注意C风格字符数组要以NULL结束
char name[] = { 's', 'o', 'n', 'g'};
cout << "id数组长度为:" << strlen(id) << endl;
cout << "name数组长度为:"<<strlen(name) << endl;
for (int i = 0; i != strlen(id); i++)
{
cout << id[i] << " ";
}
cout << endl;
for (int j = 0;j != strlen(name); ++j)
{
cout << name[j] << " ";
}
以上的输出结果为:
id数组长度为:4
name数组长度为:20
2 0 1 5
s o n g x ???????????2 0 1 5
请按任意键继续. . .
从以上结果我们可以看出,strlen总是假定以NULL结束,字符数组中必须以NULL结束,否则会出现意想不到的的结果。
指针和引用
相同:
可间接访问另一个值。
不同:
- 引用总是指向某个对象,是该对象的一个别名,定义时必须初始化。
- 引用初始化后,始终指向同一个特定对象,给引用赋值修改的是该引用关联的值。
- 指向const对象的指针-指向double类型const对象的指针
//允许修改cpd的值,但不能通过cpd修改所指对象的值
const double *cpd;
- const指针-指向double型对象的const指针
//不允许修改pcd的值,即不可以修改所指对象,但可以修改所指对象的值
double const *pcd
- const对象的const指针
//既不能修改指针指向,也不能修改指针对象的值
const double pi = 3.14159;
// pi_ptr is const and points to a const object
const double *const pi_ptr = π
指针和typedef
cstr是什么类型?
typedef string *pstring;
const pstring cstr;
指向string类型对象的const指针。
string s;
typedef string *pstring;
const pstring cstr1 = &s; // written this way the type is obscured
pstring const cstr2 = &s; // all three decreations are the same type
string *const cstr3 = &s; // they're all const pointers to string
疑问
已知p1 和p2 指向同一个数组中的元素,下面语句实现什么功能?
p1 += p2 – p1;
当p1 和p2 具有什么值时这个语句是非法的?
【解答】
此语句使得p1 也指向p2 原来所指向的元素。原则上说,只要p1 和p2 的类型相同,则该语句始终是合法的。只有当p1 和p2 不是同类型指针时,该语句才不合法(不能进行-操作)。但是,如果p1 和p2 不是指向同一个数组中的元素,则这个语句的执行结果可能是错误的。因为-操作的结果类型ptrdiff_t 只能保证足以存放同一数组中两个指针之间的差距。如果p1 和p2 不是指向同一个数组中的元素,则-操作的结果有可能超出ptrdiff_t 类型的表示范围而产生溢出,从而该语句的执行结果不能保证p1 指向p2 原来所指向的元素(甚至不能保证p1 为有效指针)。
作者:弦断
出处:http://www.cnblogs.com/ucas/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。