本文共 1737 字,大约阅读时间需要 5 分钟。
指针在C语言中是非常强大的工具,但需要正确理解其行为方式。以下是指针的基本规则:
算术运算的限制
指针只支持四种算术运算符:++、--、+、-。指针只能与整数进行加减操作。 指针的运算原则
p + n:指针将从当前位置开始向后移动n个存储单元。p - n:指针将从当前位置开始向前移动n个存储单元。数组大小的理解
int *p = &x时,p指向的是x这个整数的地址。int a[10]中,a实际上等于&a[0],即数组名直接指向数组的第一个元素。int b[3][4],b等于&b[0],而b[0]等于&b[0][0]。在使用指针和数组时,需要注意以下几点:
运算符优先级
[]的优先级高于*,因此int *p[4]实际上表示p是一个存放四个指针的数组。int (*q)[4]表示q是一个指向长度为4的数组的指针。数组名的含义
char* arr[]表示arr是一个存放char*类型指针的数组。char* arr[5]表示arr是一个长度为5的数组,arr[0]将被转换为char*类型。动态创建数组时,需要注意以下几点:
一维数组的动态创建
int *p = new int[11];:通过new操作符动态创建一个长度为11的整数数组。delete[] p;或delete p;(后者会导致未释放内存的错误)释放内存。二维数组的动态创建
int (*p)[102] = new int[4][102];:创建一个长度为4、每个元素大小为102的二维数组。delete[] p;释放内存。对象的动态创建
int *p = new int(102);:p指向一个初始值为102的整数对象。int),new int;会导致错误,而new int();则会正确初始化为0。在使用类指针时,需要注意以下几点:
new与delete的正确使用
A* pA = new A;,使用delete pA;释放内存。A* pA = new A[N];,使用delete[] pA;释放内存。括号的作用
new A:默认调用无参数构造函数。new A(5):调用A(int)构造函数。new A():与new A效果相同,都是调用无参数构造函数。数组对象的赋值
int (*p)[4] = new int[4];:p是一个指向整数数组的指针,数组大小为4。int (*p)[4] = new int;:这样赋值是错误的,因为new int返回的是一个单个整数的地址,而p要求一个大小为4的数组地址。在编写代码时,括号的使用非常重要:
中括号[]
int a[3]:a是一个长度为3的整数数组。int* a[3]:a是一个存放3个整数指针的数组。小括号()
int* a = new A(5):调用A(int)构造函数。int* a = new A();:默认调用无参数构造函数。在编写代码时,以下错误需要避免:
常数的重定义
const int x = 1; int *p = &x;:这样会修改x的值,违反常量的规定。int const *p = &x;。数组与指针的混淆
int a[10]; int *p = a;:这里的a是数组的地址,而p需要一个数组的地址。int *p = &a[0];。动态数组的初始化
int* arr = new int[3]{1, 2, 3};:无法在动态创建数组时进行初始化,正确的做法是逐个赋值。类指针的正确使用
int (*p)[4] = new int[4];:这里的p是一个指向整数数组的指针。[],p将无法正确表示数组的大小。转载地址:http://dqpi.baihongyu.com/