【C++】(四)数组、指针

 

C++ 随机数

在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数

C++数组

声明数组 

type arrayName [ arraySize ];

初始化数组

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边

数组参数的传递

形式参数是一个指针——指向首地址
void myFunction(int *param)
{   }

形式参数是一个已定义大小的数组:
void myFunction(int param[10])
{   }

形式参数是一个未定义大小的数组:
void myFunction(int param[])
{   }

调用:
调用的时候实参直接填写数组名即可

 

C++数组变型 

多维数组

声明

type name[size1][size2]...[sizeN];
int threedim[5][10][4];

初始化

int a[3][4] = {  
 {0, 1, 2, 3} ,   /*  初始化索引号为 0 的行 */
 {4, 5, 6, 7} ,   /*  初始化索引号为 1 的行 */
 {8, 9, 10, 11}   /*  初始化索引号为 2 的行 */
};

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

指向数组的指针

传递数组给函数

从函数返回数组 

 C++ 字符串

字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。

声明及初始化创建

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";

 

C++ 中的 String 类

  •  1. append() -- 在字符串的末尾添加字符
  •  2. find() -- 在字符串中查找字符串
  •  4. insert() -- 插入字符
  •  5. length() -- 返回字符串的长度
  •  6. replace() -- 替换字符串
  •  7. substr() -- 返回某个子字符串

指针 

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

C++ Null 指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为指针。NULL 指针是一个定义在标准库中的值为零的常量

 int  *ptr = NULL;

如需检查一个空指针,您可以使用 if 语句,如下所示:

if(ptr)     /* 如果 ptr 非空,则完成 */
if(!ptr)    /* 如果 ptr 为空,则完成 */

 

 C++ 指针的算术运算

ptr++:它的取值跟定义的数据类型有关,如果指向的是一个整数,则下一次会指向下一个整数的位置,所以地址的值+4;如果是字符类型,则会+1;注意地址+1代表移动一个数据类型的长度。*ptr是取ptr地址处数据的长度
int height[10];//int型的数组
cout << &height << endl;//&用在数组名上
cout << &height[0] << endl;//&用在数组第一个元素上

上面 &height[0] 就是取得是数组第一个元素的地址,假设地址为 1000;&height 是直接对数组名进行取地址,这个时候就是取得是 height 整个数组的地址,指向包含 10 个元素的 int 型数组,地址范围为 1000~1036;我们知道 height 等价于 &height[0],height+1 会将地址加 4 个字节;但 &height+1 就是将地址增加 10*4 个字节。

 C++ 指针 vs 数组

只要var的值(地址)不变,那么相应位置的数值改变了,该数组的地址也不会受到影响。

   int  var[MAX] = {10, 100, 200};  
   cout<<var<<endl;  //0x7ffda7291170
   cout<<*var<<endl;  //10
   for (int i = 0; i < MAX; i++)
   {
      *var = i;    // 这是正确的语法;实际上是改变了数组中的第一个元素的值;每次循环都是一样的
       cout<<*var<<endl;  //0
       cout<<i<<endl;  //0
       cout<<&i<<endl;  //0x7ffda729116c  接下来的循环;值不变
       cout<<var<<endl;  //0x7ffda7291170  接下来的循环;值不变

   var++ 实际上是 var=var+1,而var是常量,不能出现在=(赋值符号)的左边,但是 *(var+i)、&var[i]都是允许的

int main ()
{
    int var[3] = {10,100,200};
    int *p=var;
    for (int i = 0; i < 3; i++)
    {
        cout << *(var++) << endl;    
            //编译错误,因为var是数组名(也是数组首元素地址),不是一个变量,不可修改其值
        cout << *(var+i) << endl; 
            //编译正确,因为没有对var进行赋值,只是通过与i相加访问变量地址
        cout<<  *(p++)<<endl;        
            ///编译正确,p为指针变量可赋值
    }
    return 0;
}

 

指针数组 

声明:

int *ptr[MAX];
ptr是一个数组,但是其中ptr的每个元素,都是一个指向 int 值的指针

指针;指针数组;数组指针区别

C++ 的运算符优先级顺序和C的不一样,有细微差别。

int *ptr[3]; 
由于 C++ 运算符的优先级中,* 小于 [],所以 ptr 先和 [] 结合成为数组
然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针
简称指针数组。

int *(ptr[3]);
这个和上面的一样,优先级顺序是 * 小于 (),() 等于 []。ptr 先和 [] 结合成为数组
然后再和 int * 结合形成数组的元素类型是 int * 类型,得到一个叫一个数组的元素是指针
也是指针数组

int (*ptr)[3];
这个就不一样了,优先级顺序是 * 小于 (),() 等于 [],() 和 [] 的优先级一样,
但是结合顺序是从左到右,所以先是 () 里的 * 和 ptr 结合成为一个指针,
然后是 (*ptr) 和 [] 相结合成为一个数组,最后叫一个指针 ptr 指向一个数组,简称数组指针

括号优先级较高

 

C++ 指向指针的指针(多级间接寻址)

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置 

声明

int **var;

其实二级地址和一级地址相同

C++ 传递指针给函数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值