指针-C语言(初阶)

news/2025/1/12 8:47:46/

目录

一、什么是指针

二、指针和指针类型

        2.1 指针+-整数

        2.2 指针的解引用

三、野指针

        3.1 野指针形成原因

        3.2 如何规避野指针

四、指针运算

        4.1 指针+-整数

        4.2 指针-指针

        4.3 指针的关系运算

五、指针和数组

六、二级指针

七、指针数组


一、什么是指针

        指针是内存中一个最小单元的编号,也就是地址。平时所说的指针指的是指针变量,是用来存放内存地址的变量。
        

         指针变量:通过&(取地址操作符)取出变量的内存起始地址,将地址存放到变量中,这个
变量就是指针变量。

      int main()
{
        int a = 10;//在内存中开辟一块空间
        int *p = &a;//p为指针变量,使用&取出变量a的地址
        return 0;
}

        指针变量用来存放地址,地址是唯一标识一个内存单元的,指针的大小在32位平台是4个字节,在64位平台是8个字节

二、指针和指针类型

        指针变量都有相应的类型

char *pc = NULL;        //字符型,存放字符类型变量的地址
int *pi = NULL;            //整型,存放整型变量的地址
short *ps = NULL;      //短整型
long *pl = NULL;        //长整型
float *pf = NULL;        //单精度型
double *pd = NULL;       //双精度型

        2.1 指针+-整数

int main()
{
        int n = 10;
        char *pc = (char*)&n;
        int *pi = &n;
        printf("%p\n", &n);
        printf("%p\n", pc);
        printf("%p\n", pc+1);
        printf("%p\n", pi);
        printf("%p\n", pi+1);
        return 0;

}

        

         指针的类型决定指针向前或向后走一步有多大(距离)

        2.2 指针的解引用

int main()
{
        int n = 0x11223344;
        char *pc = (char *)&n;
        int *pi = &n;
        *pc = 0; 
        *pi = 0;
        return 0;
}

        指针的类型决定对指针解引用时能操作几个字节。例如:char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

三、野指针

        3.1 野指针形成原因

        1. 指针未初始化

int main()
{
        int *p;        //局部变量指针未初始化,默认为随机值
        *p = 20;
        return 0;
}

        2. 指针越界访问

int main()
{
        int arr[10] = {0};
        int *p = arr;
        int i = 0;
        for(i=0; i<=11; i++)
        {
                //当指针指向的范围超出数组arr的范围,p成为野指针
                *(p++) = i;
        }
        return 0;
}

        3. 指针指向的空间释放

        3.2 如何规避野指针

        1. 指针初始化

        2. 注意指针越界

        3. 指针指向的空间释放,及时置NULL

        4. 避免返回局部变量的地址

        5. 指针使用前检查有效性

int main()
{
        int *p = NULL;
        //....
        int a = 10;
        p = &a;
        if(p != NULL)
        {
                *p = 20;
        }
        return 0;
}

四、指针运算

        指针运算包括指针+-整数、指针-指针和指针的关系运算。

        4.1 指针+-整数

int main3()
{
    float values[5];
    float* p;
    for (p = &values[0]; p < &values[5];)
    {
        *p++ = 0;
    }
}

        4.2 指针-指针

int my_strlen(char* s)
{
    char* p = s;
    while (*p != '\0')
        p++;
    return p - s;
}
int main()
{
    char arr[] = "abc";
    char* p=NULL;
    p = arr;
    printf("%d", my_strlen(p));
    return 0;
}

        4.3 指针的关系运算

for (p = &values[0]; p < &values[5];)
    {
        *p++ = 0;
    }

五、指针和数组

        除特殊的两种情况外,数组名表示的是数组首元素的地址。

        可以将数组名当成地址存放到一个指针中,使用指针来访问。

int main()
{
        int arr[] = {1,2,3,4,5,6,7,8,9,0};
        int *p = arr;         //指针存放数组首元素的地址
        int sz = sizeof(arr)/sizeof(arr[0]);
        for(i=0; i<sz; i++)
        {
                printf("&arr[%d] = %p <====> p+%d = %p\n", i, &arr[i], i, p+i);
        }
        return 0;
}

         p+i 计算的就是是数组 arr 下标为i的地址

六、二级指针

        int a=10;

        int *p=&a;

        int **p1=&pa;

        

         a的地址存放在p中,p的地址存放在p1中,p为一级指针,p1为二级指针。

        二级指针解引用

        int a=10;

        int *p=NULL;

        int **p1=&pa;

        *p1=&a;      //等同于 p=&a

        *p=20;        //等同于a=20

        **p1=20        //等同于*p=20-->a=20

七、指针数组

        指针数组是存放指针的数组。

        示例

int* arr[3];

        

 


http://www.ppmy.cn/news/1062920.html

相关文章

dji uav建图导航系列()ROS中创建dji_sdk节点包(一)项目结构

文章目录 1、整体项目结构1.1、 目录launch1.2、文件CMakeLists.txt1.3、文件package.xml1.4、目录include1.4、目录srv在ROS框架下创建一个无人机的节点dji_sdk,实现必需的订阅(控制指令)、发布(无人机里程计)、服务(无人机起飞降落、控制权得很)功能,就能实现一个类似…

20-GIT版本控制

GIT 一 简介 场景 团队协作的时候,我们项目开发会遇到代码需要进行管理的场景。 多个开发者之间,每天写的代码可能需要合并,共享。 例子:我写的用户模块、小王写的订单模块,用户模块最终需要跟订单模块合并。 每天写完代码,qq、u盘拷贝,代码合并一个项目中。 希望…

HTML <textarea> 标签

实例 <textarea rows="3" cols="20"> 收拾收拾 </textarea>定义和用法 <textarea> 标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来…

Windows商店引入SUSE Linux Enterprise Server和openSUSE Leap

在上个月的Build 2017开发者大会上&#xff0c;微软宣布将SUSE&#xff0c;Ubuntu和Fedora引入Windows 商店&#xff0c;反应出微软对开放源码社区的更多承诺。 该公司去年以铂金会员身份加入Linux基金会。现在&#xff0c;微软针对内测者的Windows商店已经开始提供 部分Linux发…

service层通用接口IBaseService增删改查操作,IBaserviceImpl

增删改查操作 public interface IBaseService<T> {/*** 查找实体对象** param property 属性名称* param value 属性值* return 实体对象&#xff0c;若不存在则返回null*/T find(String property, Object value);/*** 查找实体对象集合** param property 属性名称* …

Google Play商店优化排名因素之应用截图与视频

屏幕截图是影响转化率的最重要的视觉效果之一。大多数人只需查看应用程序屏幕截图&#xff0c;就会决定是否尝试去下载我们的应用程序。 1、在Google Play商店中&#xff0c;搜索结果页面根据我们搜索的关键词有不同的样式。 展示应用程序中最好的部分&#xff0c;添加一些文字…

sql server删除历史数据

1 函数 datediff函数: DATEDIFF ( datepart , startdate , enddate )datepart的取值可以是year,quarter,Month,dayofyear,Day,Week,Hour,minute,second,millisecond startdate 是从 enddate 减去。如果 startdate 比 enddate 晚&#xff0c;返回负值。 2 例子 删除2023年以…

简单js逆向案例(2)

文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 分析 目标网址 aHR0cHM6Ly9zZWFyY2guYmlkY2VudGV…