Cpp_数组与指针

Kiyotaka Wang Lv3

数组与指针

数组

特征

  1. 相同类型
  2. 连续存储 0 ~ n-1

一维数组

  1. 类型定义
  2. 函数接口
  • 元素个数通过参数显式地给出,不能通过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;

指针初始化(只有两种):

  1. 指定表示某个变量
  2. 申请(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 到底是什么 - 腾讯云开发者社区-腾讯云 (tencent.com)

总之,C++里面用nullptr就对了。

指针和数组的使用

a和p的区别:a是一个常量指针,值不可以改变。

a和p的区别

多维数组

在内存上和一维没有区别,并不是什么矩阵的模样。

表示法可以理解为

表示法

表示法

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 进行许可。