C/C++基础复习(三)数组和指针

C/C++ 2014年06月25日 ,

经过对标准库类型几个关键类复习后,继续对C/C++的数组和指针进行温习。http://furzoom.com/

数组和指针

数组和指针都是复合类型。

数组

数组元素可以是内置数据类型或类类型。但是没有引用的数组。

数组定义时维数使用大于等于0的常量表达式(整型字面值常量、枚举常量、用常量表达式初始化的整型const对象)。

注意:如下与C++ Primer第四版的内容不一致。

int iArr[0];    // gcc version 4.7.1 gives no warns 

数组的显式初始化,显式初始化可以不指定数组的维数。如,

cosnt unsigned array_size = 3;
int ia[array_size] = {0, 1, 2};
int ia2[] = {1, 2, 3, 4};     // an array of dimension 4

字符数组可以同其他类型数据一样进行初始化,也可以使用字符串字面值进行初始化。如,

char ca1[] = {'C', '+', '+c', '\0'};    // explicit null
char ca2[] = "C++";                     // null terminator added automatically, dimension 4

注意:数组下标越界是常见错误(buffer overflow)。

指针

指针用于指向对象。

C++提倡尽量避免使用指针和数组。使用vector和string类代替数组,相应的迭代器代替指针。

避免使用未初始化的指针。

void*是一种特殊的指针类型,它可以保存任何类型对象的地址。

引用与指针的差别:

  • 引用总是指向某个对象,定义引用时没有初始化是错误的。
  • 给引用赋值修改的是该引用所关联的对象的值,而不是使引用与另一个对象关联。

在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针。

两个指针可以进行减法运算,结果是标准库类型 ptrdiff_t的数据。与size_t类型一样,ptrdiff_t也是一种与机器相关的类型,在cstddef头文件中定义。size_t是unsigned类型,而ptrdiff_t是signed类型。

如果指针指向const对象,则不允许用指针来改变所指的const值。为了保证这个特性,C++语言强制要求指向cosnt对象的指针也必须具有const特性。

const double pi =  3.14;
double *ptr = π           // error: ptr is a plain pointer
const double *cptr = π    // ok: cptr is a pointer to const

同样,对于void*指针也是一样,不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址。

可以将非cosnt对象的地址赋给指向const对象的指针。如,

double dval = 3.14;
cosnt double *cptr = &dval;  // ok: but can't change dval throuth cptr

const指针不能修改指针指向的对象。

int ival = 0;
int *const pint = &ival;  // pint is a constant pointer

结合以上两种情况,指向const对象的const指。

const double pi = 3.14;
const double *const pi_ptr = π  // pi_ptr is const and points to a const object

注意

typedef string *pstring;
const pstring cstr;    //  equals to
string *const cstr;

C字符串

字符串字面值就是const char类型的数组。C风格的字符串是以null结束的字符数组。

C风格字符串的标准库函数

函数 说明
strlen(s) 返回字符串s的长度,不包括字符串结束符null
strcmp(s1, s2) 比较两个字符串s1和s2是否相同。相同返回0,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。

C语言使用malloc和free在自由存储区中分配存储空间,而C++语言使用new和delete实现相同的功能。

int *pia = new int[10];  // array of 10 uninitialized ints

动态分配的内存最后必须进行释放,否则,内存最终将会逐渐耗尽。C++语言为指针提供delete []表达式释放指针指向的数组空间。在delete和指针之间的空方括号对是必不可少的:它告诉编译器该指针指向的是数组,而并不是单个对象。

delete [] pia;

由于C字符串与C++的string不同,混合使用时应注意。

string str1("hello world");     // str1 holds hello world
char *str2 = str1.c_str();      // almost ok, but not quite
const char *str3 = str1.c_str();// ok

使用数组初始化vector对象。

const size_t arr_size = 6;
int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};
    // ivec has 6 elements: each a copy of the corresponding element in int_arr
vector<int> ivec(int_arr, int_arr + arr_size);

多维数组

多维数组就是指数组的数组。

小结

数组与指针所提供的功能类似于标准库的vector类与string类和相关的迭代器所提供的。可以把vector类型理解为更灵活、更容易管理的数组,同样,string是C风格字符串的改进类型。

迭代器和指针都能用于间接访问所指向的对象。vector类型所包含的元素通过迭代器来操纵,类似的,指针则用于访问数组元素。

某些低级任务必须使用指针和数组,但由于使用指针和数组容易出借而且难以调试,应尽量避免使用。

Terms

C-style strings

compiler extersion

compound type

const void*

delete expression

dimension

dynamically allocated

free store

heap

new expression

pointer

pointer arithmetic

precedence

ptrdiff_t

size_t

* operator

++ operator

[] operator

& operator

void*

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《C/C++基础复习(三)数组和指针》
日志链接:http://furzoom.com/c-cplusplus-primetive-knowledge-3/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部