learning pointer(advanced version)
为了防止搞混而写
下标为0?首地址?
|
|
arr
&arr
&arr[0]
存储的都是相同的地址arr
常量指针不能被改变
指向数组元素的指针(不一定是首元素)以用[]来访问数组元素
|
|
数组类型的指针
|
|
int *p[] = &arr
vsint (*p)[] = &arr
????[ ]
优先级高于*
|
|
p
=&arr
定义了一个指向数组的指针,(*p)
=arr
解引用指针得到数组首地址,(*p)[0]
=arr[0]
访问数组首元素p[0]
=arr
访问数组首地址,p[0][0]
=arr[0]
访问数组首元素
那么int *(*p)[] = { };
水到渠成了
内存映像图
内存映像图 |
---|
1 |
2 |
… |
内存地址从上往下递增
和CSAPP里面的栈画法有点不一样
delete
-
申请一个连续的内存块,然后将其视为二维数组:
1 2 3 4
int** arr = new int*[rows]; for (int i = 0; i < rows; ++i) { arr[i] = new int[cols]; }
释放时,你需要先释放每一行的内存,然后释放行指针数组:
1 2 3 4
for (int i = 0; i < rows; ++i) { delete[] arr[i]; } delete[] arr;
-
申请一个足够大的连续内存块,然后将其视为二维数组:
1
int* arr = new int[rows * cols];
在这种情况下,你只需要释放一次:
1
delete[] arr;
注意,这种方式下,
arr
实际上是一个一维数组,但是你可以像访问二维数组一样使用它(例如,arr[i][j]
实际上是arr[i * cols + j]
)。
确保在释放内存后将指针设置为nullptr
,以避免悬垂指针问题:
|
|
char?
|
|
结果为:
|
|