c语言之初识指针
指针是C语言中的一种重要概念,是c语言的灵魂。使用指针可以对内存进行直接、灵活的操作。本篇博客将向大家介绍指针的定义、用法及案例,并提醒大家使用指针时应注意的事项。
指针的定义
在C语言中,指针是一个变量,用来存储另一个变量的地址。指针变量一般使用”*”来声明,例如:
int *ptr; //ptr是一个整型指针变量
上述代码声明了一个指针变量ptr,其指向一个整型变量。就像之前学的,
整型变量:存放整型数据的变量;
字符变量:存放字符型数据的变量;
指针变量:存放指针的变量(存放地址的变量,自身也有自己的地址);
大家可以这样理解,指针就是地址,地址就是指针。
下面通过这个简单的入门案列,带大家慢慢理解指针。
int main()
{
int a = 45;
int *p; //*:标识符,只在定义或声明指针变量的时候。与下面的*不一样
p = &a; //初始化
printf("通过变量名访问值:%d\n",a);
printf("通过地址访问值:%d\n",*(&a)); //*:取值运算符,把地址中的数取出来。
printf("通过指针变量访问值:%d\n",*p);//*:取值运算符,取出指针p里的值
return 0;
}
为什么需要指针
大多数小伙伴学不好c语言就是因为学不好指针,下面通过案列让小伙伴们知道使用指针的理由。
理由1
//==========================不用指针==============================
#include<stdio.h>
void changeData(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp; //只能交换局部的。
}
int main()
{
int data1 = 10;
int data2 = 85;
printf("main交换前:data1=%d data2=%d\n",data1,data2);
changeData(data1,data2);
printf("main交换后:data1=%d data2=%d\n",data1,data2);
//交换不了,因为虽然传递的数值一样,但是地址不一样。
return 0;
}
//==========================使用指针==============================
void changeData(int *a,int *b) //用指针变量去间接访问main函数中的值。
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int data1 = 10;
int data2 = 85;
printf("main交换前:data1=%d data2=%d\n",data1,data2);
changeData(&data1,&data2);//传递地址,所以用指针变量存放地址。
printf("main交换后:data1=%d data2=%d\n",data1,data2);
return 0;
}
理由2
#include<stdio.h>
int main()
{
int a = 45;
printf("address of a :0x%p\n",&a); //0x000000000061FE1C
int *p = (int *)0x000000000061FE10;// 通过指针指向固定区域。
//volatile unsigned int *p = (volatile unsigned int *)0x000000000061FE10;
printf("address of p : 0x%p\n",p);
return 0;
}
指针的用法
指针在C语言中有着重要的作用,通过指针,我们可以获取变量的地址,直接访问和修改变量的值。以下是指针的一些用法:
- 获取变量的地址:
int var = 10;
int *ptr = &var; //获取var的地址并赋值给指针ptr
- 直接访问和修改变量的值:
int var = 10;
int *ptr = &var; //获取var的地址并赋值给指针ptr
*ptr = 20; //修改var的值为20
- 可以使用指针变量来作为函数的参数:
void addOne(int *num) {
*num = *num + 1;
}
int main() {
int var = 10;
addOne(&var); //将var的地址传给addOne函数
printf("%d", var); //var的值被修改为11
return 0;
}
指针的练习
下面给出一个案例,通过指针对数组进行排序:
#include <stdio.h>
void bubbleSort(int *arr, int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (*(arr + j) > *(arr + j + 1)) {
temp = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = temp;
}
}
}
}
int main() {
int arr[] = { 3, 1, 2, 5, 4 };
int n = sizeof(arr) / sizeof(int);
int i;
bubbleSort(arr, n);
for (i = 0; i < n; i++) {
printf("%d ", *(arr + i));
}
return 0;
}
上述代码通过指针将一个整型数组进行了排序,通过指针对数组元素进行了操作。
指针的注意事项
指针在使用过程中应注意以下几点:
-
在指针使用前要为其赋值,否则指针将指向一个无效的地址,可能会导致程序异常。
-
在使用指针时,要确保指针指向的空间已经被分配,否则可能会导致程序崩溃。
-
在使用指针时,要确保指针的指向正确,避免出现野指针或空指针等异常情况。
-
指针可以进行指针算术和比较运算,但要注意不要越界或将不同类型的指针进行运算。
总结
指针是C语言中一个重要的概念,通过指针可以对内存进行直接、灵活的操作。使用指针时,需要注意指针的定义、用法以及注意事项。指针在程序中有着广泛的应用,掌握指针的使用方法能够提高程序的效率和代码的可读性。