数组 | 指针 | |
---|---|---|
概念 | 保存数据 | 保存数据的地址 |
赋值 | 只能一个一个元素的赋值或拷贝 | 同类型指针变量可以相互赋值 |
存储方式 | 在内存中是连续存放 数组的存储空间,不是在静态区就是在栈上 | 可以指向任意类型的数据 指针的存储空间不能确定 |
求sizeof | 数组所占存储空间的内存:sizeof(数组名) 数组的大小:sizeof(数组名)/sizeof(数据类型) | 在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。 |
初始化 |
| |
传参 | 数组传参时,会退化为指针。 (1)退化的意义:C语言只会以值拷贝的方式传递参数,参数传递时,如果只拷贝整个数组,效率会大大降低,并且在参数位于栈上,太大的数组拷贝将会导致栈溢出。 (2)因此,C语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名看做常量指针,传数组首元素的地址。 | 1.一级指针传参 当函数参数部分是一级指针时,可以接受什么参数例如:
2.二级指针传参 即当函数参数部分是二级指针时,可以接受什么参数例如:
|
【补充】:
-
数组的创建和销毁
(1)一维数组:
int* arr = new int[n];//创建一维数组
delete[] arr;//销毁
(2)二维数组:
int** arr = new int*[row];//这样相当于创建了数组有多少行
for(int i=0;i<row;i++)
{
arr[i] = new int[col];//到这里才算创建好了
}
//释放
for(int i=0;i<row;i++)
{
delete[] arr[i];
}
delete[] arr;
-
指针数组、数组指针
(1)指针数组:它实际上是一个数组,数组的每个元素存放的是一个指针类型的元素。
int* arr[8]; //优先级问题:[]的优先级比*高 //说明arr是一个数组,而int*是数组里面的内容 //这句话的意思就是:arr是一个含有8和int*的数组
(2)数组指针:它实际上是一个指针,该指针指向一个数组。
int (*arr)[8]; //由于[]的优先级比*高,因此在写数组指针的时候必须将*arr用括号括起来 //arr先和*结合,说明p是一个指针变量 //这句话的意思就是:指针arr指向一个大小为8个整型的数组。
-
函数指针、函数指针数组、函数指针数组的指针
(1)函数指针
- 定义:
函数指针是指向函数的指针变量。函数指针本身首先是一个指针变量,该指针变量指向一个具体的函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。
- 用途:
调用函数和做函数的参数,比如回调函数。
- 示例:
char * fun(char * p) {…} // 函数fun char * (*pf)(char * p); // 函数指针pf pf = fun; // 函数指针pf指向函数fun pf(p); // 通过函数指针pf调用函数fun
函数指针的形式:类型(*)( ),例如:int (*p)( ).它可以存放函数的地址,在平时的应用中也很常见。
(2)函数指针数组
形式:例如int (*p[10])( );
因为p先和[ ]结合,说明p是数组,数组的内容是一个int (*)( )类型的指针
函数指针数组在转换表中应用广泛(3)函数指针数组的指针
指向函数指针数组的一个指针,也就是说,指针指向一个数组,数组的元素都是函数指针
void test(const char* str) { printf("%s\n", str); } int main() { //函数指针pfun void (*pfun)(const char*) = test; //函数指针的数组pfunArr void (*pfunArr[5])(const char* str); pfunArr[0] = test; //指向函数指针数组pfunArr的指针ppfunArr void (*(*ppfunArr)[10])(const char*) = &pfunArr; return 0; }
-
野指针是什么?
野指针就是指向一个已删除的对象或者未申请访问受限内存区域的指针。
造成野指针的原因?分两种情况:
1. 指针变量没有被初始化;
2. 指针被delete后,未被置为NULL,让人误以为是“合法指针“。
【注意】
1. 指针置为NULL,而不delete,会造成内存泄漏;
2. 将指针delete而不置为NULL,会形成“野指针”;
3. delete只是把指针所指向的内存给释放掉,并没有把指针本身干掉。指针所存地址并未改变,只是该地址对应的内存已被释放,p成了“野指针”;
-
智能指针、智能指针内存泄漏情况及解决方法