数组与指针
基本概念
指针是c/c++中一个非常重要的概念。如果在程序中定义了一个变量,在对程序进行编译时,系统会给这个变量分配内存单元。编译系统会根据程序中定义的变量类型分配一定长度的空间。例如,c++ 为整形变量分配4个字节,为字符型变量分配1个字节。内存区的每个字节都有编号,就是地址。
通过地址能够找到所需的变量单元,因此包地址形象化的称为指针。
如果一个变量专门用来存放另一个变量的地址,则它称为指针变量,指针变量的值是地址(即指针)。
指针是一个地址,指针变量时存放地址的变量。
实例演示
指针变量的声明与赋值
#include <iostream>
#include <string.h>
int* p; // 声明一个指针变量
int var = 10;
p = &var; // 将变量的地址赋值给指针
*p = 100; // 通过变量var的地址来修改var的元素
std::cout << "var = " << var << std::endl;
输出结果
var = 100
数组
数组是一组有序数据的集合,数组的每一个元素都属于同一个数据类型。一维数组是数组中最简单的,它的元素只需要用数组名家一个下标就能唯一的确定。
int arr[10]; //声明一个数组
// 为数组元素赋值
for (int i = 0;i<10;i++)
{
arr[i] = i;
}
数组名arr本质代表第一个元素的地址,所以访问数组arr中的第1个元素有两种方式。
std::cout << *arr << std::endl;
std::cout << arr[0] << std::endl;
输出结果
0
0
声明一个数组本质上是在一个地址上申请指定大小的内存,以下的两种操作本质上是一样的。
// 方式1
int arr[10];
for (int i=0;i<10;i++)
{
arr[i]=1;
}
// 方式2
int arr2 = (int*)malloc(sizeof(int)*10);
for (int i=0;i<10;i++)
{
arr2[i]=i;
}
std::cout << arr[1] << std::endl;
std::cout << arr2[2] << std::endl;
通过memcpy方式
int arr[10];
for (int i=0;i<10;i++)
{
arr[i]=i;
}
int* arr2 = (int*)malloc(sizeof(int)*10);
memcpy(arr2,arr,sizeof(int)*10);
std::cout << "arr2[9] = " <<arr4[9] << std::endl;
输出结果
arr2[9] = 9
直接往某个地址里复制数组
int arr[10];
for (int i=0;i<10;i++)
{
arr[i]=i;
}
int* p;
int var = 10;
p = &var; // 指针变量必须先拿到地址,否则就是空指针,不能做任何操作
memcpy(p,arr,sizeof(int)*10);
std::cout << "*p = " <<*p << std::endl;
std::cout << "p[9] = " <<p[9] << std::endl;
输出结果:
*p = 0
p[9] = 9