指针是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