chapter4ArrayPointFor4th

本文详细介绍了C++中的指针使用规范,包括避免定义未初始化指针、指针算术运算规则、const指针的理解及初始化,以及C风格字符串的使用方法。同时讨论了动态内存分配和多维数组的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可避免定义一个未初始化的指针。

指针的算术操作只有在原指针和计算出来的新指针都指向同一个数组的元素,或指向该数组存储空间的下一单元时才是合法的。

          const size_t arr_sz = 5;
          int int_arr[arr_sz] = { 0, 1, 2, 3, 4 };
          // pbegin points to first element, pend points just after the last
          for (int *pbegin = int_arr, *pend = int_arr + arr_sz;
                    pbegin != pend; ++pbegin)
              cout << *pbegin << ' '; // print the current element
数组也可以类似vector设置一个end的指针来指示末尾的位置,确保程序的正确性。


不能使用 void* 指针保存 const 对象的地址,而必须使用 const void* 类型的指针保存 const 对象的地址

如果把指向 const 的指针理解为“自以为指向 const 的指针”,这可能会对理解有所帮助。

与任何 const 量一样,const 指针也必须在定义时初始化。


=================================================================GOOD EXAMPLE===============================================================================

在 typedef(第 2.6 节)中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:

          typedef string *pstring;
          const pstring cstr;

请问 cstr 变量是什么类型?简单的回答是 const pstring 类型的指针。进一步问:const pstring 指针所表示的真实类型是什么?很多人都认为真正的类型是:

          const string *cstr; // wrong interpretation of const pstring cstr

也就是说,const pstring 是一种指针,指向 string 类型的 const 对象,但这是错误的。

错误的原因在于将 typedef 当做文本扩展了。声明 const pstring 时,const 修饰的是 pstring 的类型,这是一个指针。因此,该声明语句应该是把 cstr 定义为指向 string 类型对象的 const 指针,这个定义等价于:

          // cstr is a const pointer to string
          string *const cstr; // equivalent to const pstring cstr


typedef int * pint;
 const int ia = 0;
 const int ib =5;
 int ic =9;
 const pint pa = &ia;//error :pa是指针常量
 pint const pb = &ib;//error :pa是指针常量,即不论const放在typedef定义的名称的前后,const修饰的都是指针
 const pint pc = &ic;
 pint const pd = &ic;

 

===============================================因此在使用typedef定义的指针的时候,最好把const放在后面,符合习惯=========================================


4.3 C风格的字符串

字符串字面值的类型就是 const char 类型的数组

strlen(s)
 Returns the length of s, not counting the null.

返回 s 的长度,不包括字符串结束符 null
 
strcmp(s1, s2)  Compares s1 and s2 for equality. Returns 0 if s1 == s2, positive value if s1 > s2, negative value if s1 < s2.

   比较两个字符串 s1 和 s2 是否相同。若 s1 与 s2 相等,返回 0;若 s1 大于 s2,返回正数;若 s1 小于 s2,则返回负数
 
strcat(s1, s2)  Appends s2 to s1. Returns s1.

   将字符串 s2 连接到 s1 后,并返回 s1
 
strcpy(s1, s2)
    Copies s2 into s1. Returns s1.

   将 s2 复制给 s1,并返回 s1
 
strncat(s1, s2,n)
    Appends n characters from s2 onto s1. Returns s1.

   将 s2 的前 n 个字符连接到 s1 后面,并返回 s1
 
strncpy(s1, s2, n)
    Copies n characters from s2 into s1. Returns s1.

   将 s2 的前 n 个字符复制给 s1,并返回 s1
 

传递给这些标准库函数例程的指针必须具有非零值,并且指向以 null 结束的字符数组中的第一个元素。
对大部分的应用而言,使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串。

 

4.4 内存的动态分配

new    对于内置数组的初始化也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化:

          int *pia2 = new int[10] (); // array of 10 uninitialized ints


==========================注意上面的程序中()中不可有任何数字,默认值为0=================================================================


在做string和char*的转换的时候,要注意:
c_str 返回的数组并不保证一定是有效的,接下来对 string 对象的的操作有可能会改变 string 对象的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。

 

4.5 多维数组


实质是数组的数组,也可以理解为指针数组;

在下面的声明中,圆括号是必不可少的:
  int *ip[4]; // array of pointers to int
  int (*ip)[4]; // pointer to an array of 4 ints

typedef 类型定义可使指向多维数组元素的指针更容易读、写和理解。以下程序用 typedef 为 ia 的元素类型定义新的类型名:

     typedef int int_array[4];
     int_array *ip = ia;


=====================================================抽空看看typedef的用法,除了不是简单的替换之外还有什么特性?===========================================

 

 

 

 

 

 

===================================关于size_t 和ptrdiff_t =================================
=
=ptrdiff_t 是在 cstddef 头文件中定义的与机器相关的有符号整型,该类型具有足够的大小存储两个指针的差值,这两个指针指向同一个可能的最大数组。
=
=
=
=size_t是在 cstddef 头文件中定义的与机器相关的无符号整型,它具有足够的大小存储一个可能的最大数组。


=

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值