指针数组和指向数组的指针

int p[4]和int (p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 img 以上代码若运行会报如下错误 img main函数中定义的a数组本质是一个指向int[2]的指针,而函数形参则是一个指针数组,即形参的a是一个二维指针,所以会报错类型不匹配 若将形参改为int (*a)[2]则编译通过

数组中a和&a的区别

假如a是一个一维数组,输出a和&a发现结果相同,都是一维数组首元素的地址,但两者虽然值相同,却是不同的 img 这段代码是没问题的,但若将第二行的&a改为a,则会报错 img 即编译器认为a是int 类型的,而&a则是int ( )[4]类型的,用大白话讲就是&a编译器可以认出a是一个数组,a则不行

1
2
3
4
5
6
7
8
9
10
11
12
#include "stdio.h"
int main()
{

int a[5] = {
1,2,3,4,5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
/*getchar是用VS编写方便查看输出*/
getchar();
return 0;
}

请思考一下上面的输出结果,如果你非常自信了,可以不用往下看 这个题目主要考察&a 和 a

  • a 在这里代表是的数组首元素的地址即 a[0]的首地址,其值为 0x005efda0。
  • &a 代表的是数组的首地址,其值为 0x005efda0。
  • a+1 的值是 0x005efda0+1*sizeof(int),等于 0x005efda4。
  • &a+1 的值是(0x005efda0 +(sizeof(a)= 5*sizeof(int))= 0x005efdb4 {0xcccccccc, 0xcb626a90, 0x005efdd0, 0x0029200e, 0x00000001}

二级指针

指向指针的指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//一些常用的头文件
#include<stdio.h>
#include<iostream>
using namespace std;

/*
通过引用直接去修改数组里的元素
小技巧:函数写在主函数(main)前面,就不用写函数声明了
*/
void SetArray(int row,int col,int** &Array){
//&是引用符号,得到的是指针地址
//二维指针需要通过一维指针去指向数组
Array = new int*[row]; //开辟行空间
for(int i = 0;i < row;i++){

Array[i] = new int[col]; //开辟列空间
for(int j = 0;j < col;j++){

Array[i][j] = 0;//初始化,也可以将其他数组或是值存进去
}
}
}
//打印数组里的内容
void PrintArray(int** Array,int row,int col){

for(int i = 0;i < row;i++){

for(int j = 0;j < col;j++){

cout << Array[i][j] << " ";
}
cout << endl;
}
}
//内存释放:开辟的数组空间用完必须要手动释放,不然会爆内存
void DeleteArray(int** Array,int row){

for(int i = 0;i < row;i++){

delete[] Array[i];
}
delete Array;
}
int main(){

int** Array = NULL;
int row = col = 3;
SetArray(row,col,Array);
PrintArray( Array,row,col);
DeleteArray(Array,row);
return 0;
}