自学内容网 自学内容网

指针及其用法

指针及其用法

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)!