c++ primer 4 数组和指针

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;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值