详解C语言学习记录之指针攻略
一、指针的定义及基本操作
- 指针的定义:指针是一个变量,其值为另一个变量的地址。即:“指向”另一个变量的变量。
指针的定义格式为:
data_type *pointer_name;
其中,data_type 表示指针变量所指向的数据类型;pointer_name 为指针变量的名字。
例如:
int a; // 定义一个int类型的变量a
int *p; // 定义一个指向int类型变量的指针变量p
p = &a; // 取a的地址赋值给p
-
指针的基本操作:取址、取值、指针运算、指针比较
-
取址操作:使用 & 运算符获取变量的内存地址,例如:
int a;
int *p;
p = &a; // 取a的地址赋值给p
- 取值操作:使用 * 运算符获取指针指向的变量的值,例如:
int a = 100;
int *p;
p = &a;
printf("%d", *p); // 输出a的值100
- 指针运算:指针可以进行加、减运算,例如:
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // 指针p指向数组第一个元素的地址
printf("%d\n", *(p + 2)); // 输出第3个元素的值3
- 指针比较:可以使用比较运算符 <、>、==、!=、<=、>= 比较两个指针的大小,例如:
int a[5] = {1, 2, 3, 4, 5};
int *p1 = &a[2];
int *p2 = &a[4];
printf("%d\n", p1 < p2); // 输出1,即p1的地址小于p2的地址
二、指针与数组的关系
- 数组名与指针名的关系
数组名的本质是数组第一个元素的指针,可以通过数组名来获取其指向的第一个元素的地址,并可以通过指针名来操作数组元素,例如:
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // 指针p指向数组第一个元素的地址
printf("%d\n", *p); // 输出数组第一个元素的值1
printf("%d\n", *(a+1)); // 输出数组第二个元素的值2
- 数组与指针的区别
数组是由一组相同类型的数据元素构成的集合,其大小固定;而指针则是变量的地址,在程序运行时可以动态地指向不同的变量,其大小不固定。
三、指针与函数参数
- 传递指针参数
在 C 语言中,函数参数是通过值传递的,即函数参数接收的是实参的值的拷贝。当需要在函数内部修改实参的值时,可以将实参的地址传递给函数,即传递指针参数。例如:
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 2, y = 3;
swap(&x, &y);
printf("x = %d, y = %d", x, y); // 输出x = 3, y = 2
return 0;
}
- 函数返回指针
在 C 语言中,函数可以返回指针,用于指向函数内部定义的变量或动态分配的内存空间。例如:
int *get_number() {
int *p = (int *)malloc(sizeof(int)); // 动态分配内存
*p = 100;
return p; // 返回指向动态分配内存空间的指针
}
int main() {
int *p;
p = get_number();
printf("%d", *p); // 输出100
free(p); // 释放动态分配的内存
return 0;
}
四、指向数组的指针
可以定义指向数组的指针,例如:
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // 指针p指向数组第一个元素的地址
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i)); // 依次输出数组a的元素值
}
五、示例说明
- 指针变量的使用示例
int main() {
int a = 1, b = 2, c = 3;
int *p1, *p2, *p3; // 定义三个指向int类型变量的指针
p1 = &a; // 取a的地址赋值给p1
p2 = &b; // 取b的地址赋值给p2
p3 = &c; // 取c的地址赋值给p3
*p1 = 10; // 修改*p1所指向的变量的值
*p2 = *p1 + *p3; // 修改*p2所指向的变量的值
p3 = p1; // 修改p3的指向,使其指向p1所指向的地址
printf("a = %d, b = %d, c = %d", a, b, c); // 输出a = 10, b = 13, c = 3
return 0;
}
- 函数传递指针参数的示例
void bubble_sort(int *a, int n) {
for (int i = n - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (*(a + j) > *(a + j + 1)) {
int temp = *(a + j);
*(a + j) = *(a + j + 1);
*(a + j + 1) = temp;
}
}
}
}
int main() {
int a[5] = {5, 4, 3, 2, 1};
bubble_sort(a, 5); // 传递数组a的地址和长度5
for (int i = 0; i < 5; i++) {
printf("%d ", *(a + i));
}
return 0;
}
以上是针对C语言中指针的详解攻略,详细讲解指针的定义、基本操作、与数组关系、函数参数、以及指向数组的指针,并给出了两个示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C语言学习记录之指针 - Python技术站