欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++ primer 4 数组和指针

程序员文章站 2022-03-02 13:58:31
...
1 数组
显式初始化数组
int ia[3] = {1,2,3};
如果没有显式提供元素初值,则数组元素会像普通变量一样初始化
a)如果函数体外定义的内置数组,其元素均初始化为0
b)在函数体内定义的内置数组,其元素无初始化
 
不允许数组直接复制和赋值
 
数组操作
a)数组下标类型是size_t
 

 
2 指针
指针概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用
指针保存的是另一个对象的地址:
string s("hello word");
string *sp = &s;
定义 了一个指向stirng类型的指针sp,并初始化sp使其指向string类型的对象s
*sp 中的*操作符表明sp是一个指针变量,&s中的&符号是取地址操作符,当此操作符用于一个对象上,返回的是该对象的存储地址。
 
 
指针的定义和初始化
1)对象变量的定义
vector<int> *pvec;
int * ip1,ip2;
string * pstring;
double *dp;
 
理解指针声明语句时,请从右向左阅读
 
string *psring
把pstring定义为一个指向string类型对象的指针变量
 
指针的可取值
一个有效的指针必须是以下三种状态:
保存一个特定对象的地址
指向某个对象的另一个对象
0值
int *pi = 0;
 
 
避免使用未初始化的指针
建议程序员在使用之前初始化所有变量,尤其是指针
 
 
void*指针
C++提供了一种特殊的指针类型void* 它可以保存任何类型对象的地址
void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型
 
4.2.3指针操作
对指针进行解引用可访问它所指的对象,*操作符(解引用操作符)将获取指针所指的对象
int main()
{
int a = 10;
int *p = &a;
cout << *p <<endl;
cout << *p + 1 <<endl;
return 0;
}
 
1 生成左值的解引用操作
解引用操作符返回指定对象的左值,利用这个功能可修改指针所指对象的值
        string s = "good";
string s2 = "nice";
string *sp = &s;
sp = &s2;
cout << *sp <<endl;

 

    
关键概念:给指针赋值或通过指针进行赋值
如果对左操作数进行解引用,则修改的是指针所指对象的值
如果没有使用解引用操作,则修改的是指针本身的值。
 
4.2.4使用指针访问数组元素
    C++语言中,指针和数组密切相关。特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针
    int ai[] = {0,2,4,6,8}
    int *ip = ia;
 
 
 

4.3 C网络字符串
    字符串字面值的类型是字符常量的数组
    字符串字面值的类型就是const char 类型数组
    C风格字符串是以空字符null结束的字符数组
 
    1C网络字符串的使用
    C++语言通过(const)char *类型的指针来操纵C网络的字符串
    一般来说,我们使用指针的算术操作来遍历C网络字符串,每次对指针进行测试并递增1,直到到达结束符null为止:
    
int main(void)
{
const char *p = "hello point";
while(*p)
{
cout << *p <<endl;
p++;
}
return 0;
}
 
    2 C网络字符串的标准库函数
    #include <cstring>
    cstring是string.h头文件的C++版本
int main(void)
{
const char *a = "this is a good man";
const char *b = "my name is C++";
int i = strcmp(a,b);
cout << i <<endl;
 
cout << strlen(a) << endl;
return 0;
}
 
    3 在使用处理c网络字符串的标准库函数时,牢记字符串必须以结束符null结束
    
    4 传递给标准库函数strcat strcpy的第一个实参数组必须具有足够大的空间存放新生成的字符串
 
    5 如果必须使用C网络字符串,则使用标准库函数strncat 和strncpy比strcat和strcpy更安全
 
    6 尽可能使用标准库类型string
 
 
4.3.1创建动态数组
    动态分配的数组将一直存在,直到程序显式释放它为止
    
    1动态数组的定义
    int *pia = new int[10];
 
    2 初始化动态分配的数组
    string *psa = new string[10];
    int *pia = new int [10];
    分配了存储10个int对象的内存空间,但这些元素没有初始化
  
     int *pia2 = new int[10]();
    圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0
 
    4 允许动态分配空数组
    之所以要动态分配数组,是由于编译时不知道数组长度
    
    5 动态空间释放
    delete [] pia;
 
    6 动态数组的使用
    通常是因为在编译时无法知道数组的维数,所以才需要动态创建数组。
    

习题4.28
从标准输入设置读入的元素数据建立一个int型vector对象,然后动态创建一个与该vector对象大小一致的数组
把vecotr对象所有元素复制给新数组
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
using std::vector;
using std::string;
 
int main()
{
vector<int> ivec;
int ival;
 
cout << "ctrl+z end input" << endl;
while(cin >> ival)
{
ivec.push_back(ival);
}
 
//动态创建数组
int *pia = new int[ivec.size()];
//复制元素
int *tp = pia;
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter,++tp)
{
*tp = *iter;
cout << *tp << endl;
}
 
delete [] pia;
return 0;
}
 
 
 
习题 4.30
编写程序连接二个C风格字符串字面值,把结果存储在一个C风格字符串中。
int main()
{
const char *s1 = "c++ primer";
const char *s2 = "apple";
size_t len = strlen(s1) + strlen(s2);
char *result_str = new char[len + 1];
strcpy(result_str,s1);
strcat(result_str,s2);
 
cout << result_str <<endl;
delete result_str;
return 0;
}