Cpp_数组与指针
数组与指针
数组
特征
- 相同类型
- 连续存储 0 ~ n-1
一维数组
- 类型定义
- 函数接口
- 元素个数通过参数显式地给出,不能通过sizeof取得
- 特例是字符串
void f(int a[], int len){
int len1 = sizeof(a)/sizeof(int);//是不对的,因为现在的a是一个指针类型的变量,而不是原来的数组了
}
//len = sizeof(a)/sizeof(int);
//为什么一定要自己传入数组的大小:传入参数时,a[]自动被转换为int *a,此时a是一个指针类型的变量
//特例是字符串,因为默认char[]的末尾默认是\0
指针
int x = 0;
int *p;
p = &x;
*p = 1000;
指针初始化(只有两种):
- 指定表示某个变量
- 申请(new)分配一定内存给它,如果没有想好就分配一个NULL
关于void *
ANSI C:宏定义NULL为(void*) 0
但是C++之父Stroustrup否定了这种定义方法
C++: #define NULL 0
void*仅仅是记录地址,所以无法使用它,它也就可以记录任何类型的变量的地址了
而
int *p1;
char *p2;
p1 = p2; //是非法的
void *p3;
p3 = p1; //合法,但是仅仅能记录地址,无法使用
但是这会造成一个问题,
void memset(void *p, unsigned int n){
char *q = (char *)p;
for(int i = 0; i < n; i++){
*(q++) = 0;
}
}
也就是null也能被转化为其他的值。
C++11之后新加入了nullptr,这中间的原因挺复杂的,因为C++不允许void指针隐式转换而造成了不少的问题(虽然也避免了许多其他的问题)。。。为了方便又加入了nullptr。。。
总之,C++里面用nullptr就对了。
指针和数组的使用
a和p的区别:a是一个常量指针,值不可以改变。
多维数组
在内存上和一维没有区别,并不是什么矩阵的模样。
表示法可以理解为
PS:Professor对蚂蚁老师和67失望了。。。
Q1:C++为什么允许越界?
因为这样做增加了语言的灵活性
多种指针表示方式:
数组升降维
- 降维
#include <iostream>
using namespace std;
int maximum(int a[], int n)
{ int max = 0;
for (int k=0;k<n;k++)
if (a[k] > max)
max = a[k];
return max;
}
int main()
{
int A[2][4] = { {68,69,70,71} , {85,86,87,89}};
cout << “the max grade is” << maximum(A[0], 2 * 4);
}
- 降维
申请new
int *p = new int[8];
malloc需要强制类型转换,而new不用,所以多用new
其次,new可以完成初始化,而不像malloc只是简单的分配内存,比如在你初始化一个类的指针时,new可以直接完成初始化(构造函数)。
有借有还
new —— delete
malloc —— free
auto_ptr
未完待续。。。
- 标题: Cpp_数组与指针
- 作者: Kiyotaka Wang
- 创建于 : 2022-10-11 18:40:18
- 更新于 : 2022-11-21 13:04:26
- 链接: https://hmwang2002.github.io/2022/10/11/cpp-shu-zu-yu-zhi-zhen/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。