指针及其用法
指针及其用法
1.定义
指针是一个变量,它存储的是一个内存地址。这个地址指向的是另一个变量或数据的位置,也就是说,指针可以直接访问内存中的数据。在C语言中,我们可以通过指针来实现参数传递、动态内存分配、数组的操作等。
2.声明
// 数据类型 *指针变量名;
int *p;
3.赋值、访问、运算
int a = 10;
int *p = &a; //取地址操作&来获取变量a的地址,并将其赋值给指针变量p
*p = 20; //通过指针变量p来访问变量a的值,并将其修改为20
4.功能
1)参数传递
在C语言中,函数的参数传递默认是值传递,也就是说,函数中的形参是实参的拷贝,对形参的修改不会影响到实参。但是,如果我们将指针作为函数的参数传递,就可以实现对实参的修改。
2)动态内存分配
在C语言中,我们可以通过malloc函数来动态地分配内存空间,malloc函数返回的是一个void类型的指针,我们可以将其强制转换为需要的数据类型的指针。例如:
//动态地分配了10个int类型的内存空间,并将其地址赋值给指针变量p
int *p = (int *)malloc(sizeof(int) * 10);
//使用完动态分配的内存空间后,我们需要使用free函数来释放这些空间,否则会造成内存泄漏
free(p);
3)指针与数组
数组名本身就是一个指针,它指向数组的第一个元素的地址;
int b[5] = {1, 2, 3, 4, 5};
int *q = &b[0]; //等同于 int *q = b;
q = q + 1; //指针可以进行加减运算,其结果为指针向前或向后移动若干个字节
4)指针与结构体
struct student {
char name[20];
int age;
float score;
};
int main() {
struct student stu = {"Tom", 18, 90};
struct student *p = &stu;
p->age = 18;
printf("name: %s, age: %d, score: %f\n", p->name, p->age, p->score);
return 0;
}
5.野指针
野指针就是指针指向位置是不可知的(随机的,不正确的,没有明确限制的)。
1)指针未初始化
#include<stdio.h>
int main()
{
int* p;//局部指针变量未初始化,默认为随机值
*p=10;
return 0;
}
2)指向局部变量的地址–局部变量所在函数结束,内存就会被释放,指针就变换成野指针。
// An highlighted block
#include<stdio.h>
int* test() //返回局部变量a的地址
{
int a = 10;
//a为局部变量,函数开始时创建,函数结束时销毁
return &a;
}
int main()
{
int* p = test();
*p = 20;
//此时p指向的空间已销毁(被释放),不属于当前程序,此时指针p就为野指针
return 0;
}
3)指针越界访问
#include<stdio.h>
int main()
{
int arr[10]={ 0 };
int* p=arr;//数组名代表首元素地址
int i=0;
for(i=0;i<12;i++)
{
*(p++)=i;
//数组元素个数为10,当i>9时,指针指向的范围超过了数组arr的范围,此时p就是野指针
}
return 0;
}
6.数组指针、指针数组、函数指针
函数指针就是指向函数的指针,用来存放函数地址的指针。
指针数组实质上为数组,与整形数组(存放整形)、字符型数组(存放字符型)类比可知,指针数组用于存放指针。
int arr[5]
//(一个五个元素的整形数组)
int *arr[5]
//(指针数组,数组包含五个元素,每个元素类型为int *)
int ( * arr)[5]
//(数组指针,指向一个有五个元素的数组)
int( * arr[10] )[5]
//(是一个数组,数组有十个元素,每个元素为一个数组指针,该数组指针指向的数组有五个元素,每个元素的类型为int)
参考原文链接:https://blog.csdn.net/weixin_75094128/article/details/129249462
原文地址:https://blog.csdn.net/niuboshi/article/details/135619185
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!