版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fuck51cto/article/details/80395153
Primer c++笔记 第四章 数组和指针
数组
数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数。
数组初始化
//
int ia[10] = {0};
int ib[10] = {0,1,2,3,4,5,6,7,8,9};
size_t arr_size = sizeof(ib) / sizeof(int);
for (size_t i = 0; i!=arr_size; ++i) {
cout<<ib[i]<<endl;
}
指针
指针是指向某种类型对象的复合数据类型,指针保存的是另一个对象的地址
指针的定义和初始化
string *ps = NULL;
char *s[100] = {NULL};
int ival = 1024;
int *pi = 0;
int *pip2 = &ival;
对大多数的编译器来说,如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。
使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针进行解引用时,通常会导致程序崩溃。
void* 指针
C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址:
double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
pv = pd;
double *pda = (double*)pv;
cout<<*pda<<endl;
指向指针的指针
指向一个指针变量
使用指针访问数组元素
数组的名字,指向数组的第一个元素
int ia[] = {0,1,2,3,4,5,6,7,8,9};
cout<<*ia<<endl; //ia[0]
指针的算术操作
指针加1,指向下一个元素
ip = ia; // ok: ip points to ia[0]
int *ip2 = ip + 4; // 在指针 ip 上加 4 得到一个新的指针,指向数组中 ip 当前指向的元素后的第 4 个元素。
遍历数组:
int int_arr[] = {0,1,2,3,4,5,6,7,8,9};
size_t arr_size = sizeof(int_arr) / sizeof(int); // 计算数组元素个数
for (int *pbegin = int_arr, *pend= int_arr+arr_size; pbegin!=pend; ++pbegin) {
cout<<*pbegin<<endl;
}
4. const 限定符
添加了const 表示变量的值不能修改。
const引用
引用的对象必须是常量。
const int ci = 1024;
const int &r1 = ci;
底层const 指针
指针 指向的变量必须是常量
const int ci = 1024;
const int *pi = &ci;
顶层const 指针
指针本身是一个常量,不能再指向其它变量。
int ia, ib = 1024;
int *const pi = &ia;
pi = &ib; // error
双层const
指针指向的变量必须是常量, 指针不能再指向其它变量。
const int ia;
C 风格字符串
字符串以null结尾
char ca1 = {'C','+','+'};
char ca2[] = {'C','+','+','\0'};
const char *cp = "C++";
char *cp1 = ca1;
char *cp2 = ca2;
创建动态数组
数组
数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数。
数组初始化
//
int ia[10] = {0};
int ib[10] = {0,1,2,3,4,5,6,7,8,9};
size_t arr_size = sizeof(ib) / sizeof(int);
for (size_t i = 0; i!=arr_size; ++i) {
cout<<ib[i]<<endl;
}
指针
指针是指向某种类型对象的复合数据类型,指针保存的是另一个对象的地址
指针的定义和初始化
string *ps = NULL;
char *s[100] = {NULL};
int ival = 1024;
int *pi = 0;
int *pip2 = &ival;
对大多数的编译器来说,如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。
使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针进行解引用时,通常会导致程序崩溃。
void* 指针
C++ 提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址:
double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
pv = pd;
double *pda = (double*)pv;
cout<<*pda<<endl;
指向指针的指针
指向一个指针变量
使用指针访问数组元素
数组的名字,指向数组的第一个元素
int ia[] = {0,1,2,3,4,5,6,7,8,9};
cout<<*ia<<endl; //ia[0]
指针的算术操作
指针加1,指向下一个元素
ip = ia; // ok: ip points to ia[0]
int *ip2 = ip + 4; // 在指针 ip 上加 4 得到一个新的指针,指向数组中 ip 当前指向的元素后的第 4 个元素。
遍历数组:
int int_arr[] = {0,1,2,3,4,5,6,7,8,9};
size_t arr_size = sizeof(int_arr) / sizeof(int); // 计算数组元素个数
for (int *pbegin = int_arr, *pend= int_arr+arr_size; pbegin!=pend; ++pbegin) {
cout<<*pbegin<<endl;
}
4. const 限定符
添加了const 表示变量的值不能修改。
const引用
引用的对象必须是常量。
const int ci = 1024;
const int &r1 = ci;
底层const 指针
指针 指向的变量必须是常量
const int ci = 1024;
const int *pi = &ci;
顶层const 指针
指针本身是一个常量,不能再指向其它变量。
int ia, ib = 1024;
int *const pi = &ia;
pi = &ib; // error
双层const
指针指向的变量必须是常量, 指针不能再指向其它变量。
const int ia;
const int *const pi = &ia;
// 指向 const 对象的指针
const double db = 512;
const double db2 = 256;
const double *pd = &db; // pd指向一个const double对象
pd = &db2; // 可以修改pd的地址
// const 指针
double *const pd1 = &db; // 指向double ,指针本身的值不能修改
//pd1 = &db2; 错误 const 指针——本身的值不能修改
// 指向 const 对象的 const 指针
// 指向const double ,指针本身的值不能修改
const double *const pd2 = &db;
C 风格字符串
字符串以null结尾
char ca1 = {'C','+','+'};
char ca2[] = {'C','+','+','\0'};
const char *cp = "C++";
char *cp1 = ca1;
char *cp2 = ca2;
创建动态数组
C 语言程序使用一对标准库函数 malloc 和 free 在自由存储区中分配存储空间,而 C++ 语言则使用 new 和 delete 表达式实现相同的功能。
多维数组
严格地说,C++ 中没有多维数组,通常所指的多维数组其实就是数组的数组:
如果数组的元素又是数组,则称为二维数组,其每一维对应一个下标:
ia[2][3] // fetches last element from the array in the last row
多维数组的初始化
int ia[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
int (*ip)[4] = ia; // ip指向4个整型数组
二维数组
二维数组由行和列组成,第一维数组保存的元素是,第二维元素的首地址
int *ip[4]; // 整型指针的数组
int (*ip)[4] // 指向含有4个整数的数组