一、什么是指针?什么是数组?两者的区别?
在计算机科学中, 指针 ( Pointer )是编程语言中的一个对象,利用地址,它的值直接指向
数组是一种数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。数组使得管理一组有序的数据变得非常方便,如计算平均值、排序等。
联系
内存存储:数组在内存中连续存储数据,而指针可以指向数组中的任何一个元素。因此,通过指针,我们可以遍历或修改数组中的元素。
访问元素:虽然数组通过索引访问元素,但我们也可以使用指针的算术运算(如指针加1)来遍历数组。
数组名:在大多数编程语言中,数组名在表达式中会被转换为指向数组首元素的指针。这意味着,你可以使用数组名作为指针来访问数组的第一个元素或遍历整个数组。
区别
本质:指针存储的是内存地址,而数组是存储相同类型数据的数据结构。
用途:指针主要用于操作内存中的数据,包括动态内存分配、函数参数传递等;数组则主要用于存储和管理一组有序的数据。
大小:指针的大小是固定的(通常为4字节或8字节,取决于系统和编译器),而数组的大小则由其包含的元素数量和元素类型决定。
灵活性:指针比数组更灵活,因为它们可以指向任何类型的数据,并且可以在运行时改变指向。而数组一旦定义,其类型和大小就固定了。
安全性:使用指针时需要更多的注意来避免内存泄漏、野指针等问题,而数组相对更安全一些(尽管数组越界仍然是一个常见问题)。
二、什么是指针数组?什么是数组指针?
指针数组是一个数组,它的每个元素都是一个指针。这些指针可以指向不同类型的数据,但通常在同一个指针数组中,所有的指针都指向相同类型的数据。指针数组允许你存储多个变量的地址,这在处理字符串数组、动态数组或者对象数组时特别有用。数组指针是指向数组的指针。它存储的是整个数组的地址,而不是数组第一个元素的地址。通过数组指针,你可以直接访问整个数组。
三、指针类型的意义
四、野指针
1、定义:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 。
2、野指针成因
- 指针未初始化
- 指针越界访问
- 指针指向的空间已经释放
3、如何规避野指针
- 指针初始化
- 小心指针越界
- 指针指向空间释放及时置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
五、&数组名和数组名分别代表的意义
- 1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数 组。
- 2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。 除此两种情况之外,所有的数组名都表示数组首元素的地址。
-
&arr 表示的是 数组的地址 ,而不是数组首元素的地址。(细细体会一下)数组的地址 +1 ,跳过整个数组的大小。
六、什么是二维数组?二级指针?函数指针?
二维数组是数组的数组,可以看作是表格或矩阵。在C语言中,二维数组通过两个索引来访问其元素,通常第一个索引表示行,第二个索引表示列。二维数组的内存分配是连续的,但在逻辑上,我们可以通过两个索引来访问它的元素,这使得它看起来像是一个二维的网格。
二级指针(或称为指针的指针)是一个存储指针地址的指针。换句话说,它指向一个指针变量。在C语言中,这允许你操作指针本身,而不仅仅是指针所指向的值。二级指针在动态内存分配、构建复杂的数据结构(如链表中的链表、树结构等)以及处理函数指针数组时特别有用。
函数指针是指向函数的指针。在C语言中,函数本身也有地址,就像变量一样。函数指针允许你存储和传递函数的地址,并通过这个地址来调用函数。这对于回调函数、将函数作为参数传递给其他函数等场景非常有用。