指针的初始化
给指针赋值的只能是内存的地址,有两种情况
1.如果内存被命名了,那可以用&符号去提取内存的地址
2.如果内存没有被命名,那可以用new符号返回未命名内存的地址
int a = 1;
int* p = &a;//1
int* q = new int;//2
指针与数组
数组名与指针大部分情况下相同,C++将数组名解释成地址,具体来说,数组名为数组第一个元素的地址,但两者情况有区别,第一个是数组名是常量而指针可以修改,第二个是sizeof的区别。
int A[10] = {0};
下面两个式子永远等价
A[i] == *(A+i)
&A[i] == A+i
动态数组
动态数组需要用new关键字创建数组(注意最后要用delete[]释放内存),相比于普通数组,动态数组的数组长度不需要在初始化时定义,从而满足更灵活的代码需求。
int size;
cin>>size;
int* p = new int[size];
Vector模板类代替动态普通数组
相比于动态普通数组,vector自动delete,建议在创建动态数组时使用vector模板类创建。
例如:
- API
- 支持模型类型
数组作为函数参数
当类似于void func(int A[],int n)的函数时,C++实际上把int A[]当作为int *A,即把A当作成一个指针;(除了这种方式,还有种方式是传递两个指针,一个指向数组开头,一个指向数组结尾),因此在把数组当作函数参数时,传给函数的有三个东西:数组的地址、数组元素的种类以及元素的数量;
将数组作为指针意味着:当数组作为参数时,由于函数接收到的是数组的地址,因此在函数对其形参进行修改时,实际上是会影响到实参的;
由于数组作为形参会影响实参的值,因此常常需要用const来保证安全性;
void func(const int A[],int n)
//类型const int * A,A指向常量;
结构作为参数传递时,处理甚至比数组简单,因此结构名等价于常规变量名,数组作为参数比较特殊的根本原因是因为数组名是地址,而常规变量和结构要获取地址还要用&符号。