C语言学习笔记_1
C语言作为一门广泛应用于系统编程和嵌入式开发的高级编程语言,指针、数组以及与它们相关的概念是初学者必须深入了解和掌握的基础知识。本人在学习C语言时,曾对指针与一维数组的应用感到复杂,为了加深理解和记忆,写下此篇浅见以为记录。
1.指针
指针是C语言中一个重要的概念,它存储了一个变量的内存地址。通过指针,我们可以直接访问和修改对应地址上的数据,提高了程序的灵活性和效率。以下是一个简单的指针示例:
#include <stdio.h>
int main() {
int num = 10;
int *ptr = #
printf("num 的值:%d\n", num);
printf("num 的地址:%p\n", &num);
printf("ptr 指向的地址:%p\n", ptr);
printf("ptr 指向的值:%d\n", *ptr);
return 0;
}
在上述示例中,我们定义了一个整型变量 num
,并赋值为10。然后,我们定义了一个整型指针 ptr
,并将 num
的地址赋给了 ptr
。通过 &
运算符,我们可以获取变量的地址;通过 *
运算符,我们可以访问指针指向的值。在输出中,我们打印了变量 num
的值和地址,以及指针 ptr
的地址和值。
需要注意的是,指针是有大小的,指针的大小取决于取决于编译器和系统的位数。 在32位系统中,指针通常占用4个字节,而在64位系统中,指针通常占用8个字节。
2.一维数组
数组是由相同类型的数据元素组成的集合,它们在内存中是连续存储的。数组提供了一种便捷的方式来存储和访问大量数据。以下是一个简单的一维数组示例:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printf("arr 的地址:%p\n", arr);
printf("arr[0] 的值:%d\n", arr[0]);
printf("arr[1] 的值:%d\n", arr[1]);
printf("arr[2] 的值:%d\n", arr[2]);
return 0;
}
在上述示例中,我们定义了一个包含5个整型元素的数组 arr
,并给它赋了初始值。通过下标运算符 []
,我们可以访问数组中特定位置的元素。在输出中,我们打印了数组 arr
的地址和前三个元素的值。
3.指针与一维数组的应用
在C语言中,一维数组和指针是紧密相关的概念,它们之间的配合是实现高效的数据操作和算法的基础。本文将深入探讨一维数组与指针的关系,并介绍它们在C语言中的应用和一些注意事项。
3.1一维数组和指针的基本概念
一维数组是一系列相同类型的元素的集合,而指针是一个变量,存储着内存地址。在C语言中,数组名实际上就是一个指向数组第一个元素的指针。
我们可以通过以下示例来说明这个概念:
#include <stdio.h>
int main() {
int arr[5]= {1, 2, 3, 4, 5};
printf("数组的第一个元素的值:%d\n", arr[0]);
printf("数组名所代表的元素的值:%d\n", *(arr));
return 0;
}
上述代码中,我们定义了一个包含5个整型元素的数组 arr
。在 printf
函数中,我们使用 arr[0]
和 *(arr)
来访问数组的第一个元素。其中,*(arr)
的用法等同于 arr[0]
。
需要注意的是,虽然数组名可以自动被转换为指针,但这并不意味着数组名和指针是完全相同的。数组名是常量,它的值是数组第一个元素的地址,而指针可以被重新赋值指向其他内存地址。
3.2数组与指针的相互转换
通过使用指针,我们可以对数组进行更加灵活的操作。可以将数组名转换为指针,并通过指针来访问和修改数组中的元素。同时,也可以将指针转换为数组名,以便于数组操作。当我们将数组名转换为指针时,实际上是获取数组第一个元素的地址。同样地,当我们将指针转换为数组名时,实际上是将指针解引用为组的第一个元素。下面是一个示例:
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr; // 将数组名转换为指针
// 通过指针遍历数组并打印每个元素
for (int i = 0; i < 5; i++) {
printf("%d ", *ptr);
ptr++; // 指针向后移动到下一个元素
}
printf("\n");
int *ptr2 = &arr[0]; // 也可以使用数组元素的地址初始化指针
// 通过指针修改数组元素的值
*ptr2 = 10; // 等价于 arr[0] = 10;
printf("%d\n", arr[0]); // 输出修改后的数组元素
return 0;
}
在上述示例中,我们首先将数组名arr
转换为指针ptr
,然后通过指针遍历并打印出数组中的每个元素。注意指针的递增操作ptr++
会使指针指向下一个元素。接着,我们又通过指针ptr2
将数组第一个元素的地址赋给了它,并用指针修改了数组中的第一个元素的值。最后,我们验证修改后的数组元素arr[0]
的值已变为10。
3.3通过指针对数组排序
一维数组和指针之间有着紧密的联系。我们可以使用指针来遍历数组元素,进行搜索和排序等操作。而在函数中,数组作为参数传递时,实际上是将数组的指针传递给函数。当将数组作为参数传递给函数时,实际上传递的是数组的指针,这样可以在函数内部对数组进行操作。下面是一个示例,展示了如何使用指针在函数中对数组进行排序:
#include <stdio.h>
// 定义一个函数,用于对数组进行排序
void sortArray(int *arr, int size) {
int i, j, temp;
for (i = 0; i < size - 1; i++) {
for (j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换相邻两个元素
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {5, 1, 4, 2, 3};
int size = sizeof(arr) / sizeof(arr[0]);
// 调用函数对数组进行排序
sortArray(arr, size);
// 输出排序后的数组
printf("排序后的数组:");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
在上述示例中,我们定义了一个函数sortArray
,该函数接受一个指向整型的指针arr
和数组的大小size
作为参数。在函数内部,我们使用冒泡排序算法对数组进行排序。通过传递数组的指针给函数,函数可以直接对数组进行修改,而无需返回任何值。在main
函数中,我们初始化一个整型数组arr
,并根据数组的大小调用sortArray
函数进行排序。最后,我们输出排序后的数组。
这个示例展示了如何在函数中使用指针对数组进行排序。通过传递数组的指针,函数可以直接修改数组的内容,使得排序操作得以实现。这样的方式可以在函数中对数组进行各种操作,包括搜索、修改和其他的算法处理。
4.数组指针和指针数组
数组指针和指针数组是两个不同的概念,它们在C语言中有着不同的特点和用法。
4.1数组指针(Pointer to an array):
在C语言中,数组指针是指一个指针,它指向一个数组的首地址。数组指针本身是一个指针变量,存储的是数组的起始地址。
示例:
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5]; // 数组指针的声明
ptr = &arr; // 将数组的地址赋值给数组指针
在上述示例中,ptr
是一个数组指针,指向一个包含5个整型元素的数组的首地址。使用&arr
将数组arr
的地址赋值给ptr
,使得ptr
指向了数组arr
。
4.2指针数组(Array of pointers):
指针数组是指一个数组,其中的每个元素都是指针类型。指针数组本身是一个数组,每个元素储存的是不同变量的地址。
示例:
int a = 1, b = 2, c = 3;
int *arr[3]; // 指针数组的声明
arr[0] = &a; // 将变量a的地址存储到指针数组的第一个元素
arr[1] = &b; // 将变量b的地址存储到指针数组的第二个元素
arr[2] = &c; // 将变量c的地址存储到指针数组的第三个元素
在上述示例中,arr
是一个指针数组,它包含了3个整型指针元素。通过将变量的地址赋值给指针数组的元素,我们可以在指针数组中存储不同变量的地址。
结论:
一维数组与指针在C语言中的默契配合是实现高效编程的关键。通过理解和掌握它们之间的关系,我们可以更加灵活地处理和操作一维数组,实现各种复杂的算法和数据结构。在使用过程中,我们也要注意避免常见的问题,保证程序的稳定性和可靠性。只有深入了解一维数组与指针的关系,我们才能更加高效地利用C语言进行编程,提高程序的质量和效率。