C语言入门课程学习笔记9:指针

news2024/10/8 11:57:48

C语言入门课程学习笔记9

  • 第41课 - 指针:一种特殊的变量
    • 实验-指针的使用
    • 小结
  • 第42课 - 深入理解指针与地址
    • 实验-指针的类型
    • 实验
    • 实验
    • 小结
  • 第43课 - 指针与数组(上)
    • 实验
    • 小结
  • 第44课 - 指针与数组(下)
    • 实验
    • 实验
    • 小结
  • 第45课 - 指针与函数
    • 实验
    • 实验
    • 小结
  • 第46课 - 指针与堆空间
    • 实验
    • 实验
    • 小结
  • 第47课 - 指针专题经典问题剖析
    • 小结

第41课 - 指针:一种特殊的变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-指针的使用

#include <stdio.h>

int main()
{
    int var = 0;
    int another = 0;
    int* pVar = NULL;

    printf("1. var = %d\n", var);
    printf("1. pVar = %p\n", pVar);

    pVar = &var;  // 使用指针保存变量的地址

    *pVar = 100;  // *pVar 等价于 var , var = 100;

    printf("2. var = %d\n", var);
    printf("2. pVar = %p\n", pVar);

    pVar = &another;  // 改变了 pVar 的指向,使得 pVar 保存 another 的地址

    *pVar = 1000;     // another = 1000;

    printf("3. another = %d\n", another);
    printf("3. pVar = %p\n", pVar);

    printf("4. add ==> %d\n", var + another + *pVar);   // 100 + 1000 + 1000  ==> 2100

    return 0;
}
/*
1. var = 0
1. pVar = 0000000000000000
2. var = 100
2. pVar = 000000000061FE14
3. another = 1000
3. pVar = 000000000061FE10
4. add ==> 2100
*/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述

第42课 - 深入理解指针与地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验-指针的类型

#include <stdio.h>

int main()
{
    int i = 10;
    float f = 10;

    int* pi = &f;    // WARNING  int* 指向了float
    float* pf = &f;  // OK

    printf("pi = %p, pf = %p\n", pi, pf);
    printf("*pi = %d, *pf = %f\n", *pi, *pf);

    pi = i;   // WARNING  

    *pi = 110;  // OOPS

    printf("pi = %p, *pi = %d\n", pi, *pi);

    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int calculate(int n, long long* pa, long long* pm)
{
    int ret = 1;

    if( (1 <= n) && (n <= 20) )
    {
        int i = 0;

        *pa = 0;
        *pm = 1;

        for(i=1; i<=n; i++)//  0+1+...+n
        {			//1*1*...*n
            *pa = *pa + i;
            *pm = *pm * i;
        }
    }
    else
    {
        ret = 0;
    }

    return ret;
}

int main()
{
    long long ar = 0;
    long long mr = 0;

    if( calculate(5, &ar, &mr) )
        printf("ar = %lld, mr = %lld\n", ar, mr);//15   1*2*3*4*5=120

    return 0;
}

在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

void func(int* p)
{
    *p = 100;   // 修改内存中 4 字节的数据,即:修改一个整型变量的值
}

void swap(int* pa, int* pb)//通过指针交换变量
{
    int t = 0;

    t = *pa;
    *pa = *pb;
    *pb = t;
}

int main()
{
    int var = 0;
    int a = 1, b = 2;

    printf("1. var = %d\n", var);

    func( &var );

    printf("2. var = %d\n", var);//100

    printf("3. a = %d, b = %d\n", a, b);

    swap(&a, &b);

    printf("4. a = %d, b = %d\n", a, b);

    return 0;
}

小结

在这里插入图片描述

第43课 - 指针与数组(上)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int main()
{
    int a[] = {1, 2, 3, 4, 0};
    int* p = a;  // a 的类型为 int*, &a[0] ==> int*
    int (*pa) [5] = &a;//指向数组的指针  注意指针类型

    printf("%p, %p\n", p, a);

    p++;//p+1==== p+1*sizeof(p)

    *p = 100;  // a[1] = 100;

    printf("%d, %d\n", *p, a[1]);
    printf("%p, %p\n", &a, a);//????值一样 但是意思不一样,数组的地址  数组首元素的地址

    p = pa;   // WARNING  !!!!   warning: assignment to 'int *' from incompatible pointer type 'int (*)[5]' 

    p = a;

    while( *p )
    {
        printf("%d\n", *p);

        p++;
    }

    return 0;
}
/*
000000000061FDF0, 000000000061FDF0
100, 100
000000000061FDF0, 000000000061FDF0
1
100
3
4
*/

小结

在这里插入图片描述

第44课 - 指针与数组(下)

在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int main()
{
    int a[] = {1, 2, 3, 4, 5};
    int* p = a;
    int i = 0;

    // a[i] <==> *(a+i) <==> *(p+i) <==> p[i]

    for(i=0; i<5; i++)
    {
        printf("%d, %d\n", a[i], *(a + i));
    }

    for(i=0; i<5; i++)
    {
        printf("%d, %d\n", a[i], p[i]);
    }

    for(i=0; i<5; i++)
    {
        printf("%d, %d\n", p[i], *(p + i));
    }

    printf("a = %p, p = %p\n", a, p);//值相同
    printf("&a = %p, &p = %p\n", &a, &p);//值不同

    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int main()
{
    int a[] = {1, 2, 3};
    int* p = a;
    int v = *p++;//int v=*p,p++;

    char* s = NULL;

    printf("%p\n", "D.T.Software");
    printf("%p\n", "D.T.Software");

    printf("v = %d, *p = %d\n", v, *p);

    printf("First = %c\n", *"D.T.Software");

    s = "D.T.Software";

    while( *s ) printf("%c", *s++);

    printf("\n");

    return 0;
}
/*
0000000000404000
0000000000404000
v = 1, *p = 2
First = D
D.T.Software
*/

小结

在这里插入图片描述

第45课 - 指针与函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int mul(int a, int b)
{
    return a * b;
}

int calculate(int a[], int len, int(*cal)(int, int))
{
    int ret = a[0];
    int i = 0;

    for(i=1; i<len; i++)
    {
        ret = cal(ret, a[i]);
    }

    return ret;
}

int main()
{
    int a[] = {1, 2, 3, 4, 5};
    int (*pFunc) (int, int) = NULL;

    pFunc = add;

    printf("%d\n", pFunc(1, 2));//3
    printf("%d\n", (*pFunc)(3, 4));//7

    pFunc = &mul;

    printf("%d\n", pFunc(5, 6));//30
    printf("%d\n", (*pFunc)(7, 8));//56

    printf("1 + ... + 5 = %d\n", calculate(a, 5, add));//15
    printf("1 * ... * 5 = %d\n", calculate(a, 5, mul));//120

    return 0;
}

在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int demo(int arr[], int len)  // int demo(int* arr, int len)//数组求和
{
    int ret = 0;
    int i = 0;

    printf("demo: sizeof(arr) = %d\n", sizeof(arr));// 8 退化为指针了

    while( i < len )
    {
        ret += *arr++;

        i++;
    }

    return ret;
}

int main()
{
    int a[] = {1, 2, 3, 4, 5};

    // int v = *a++;

    printf("return value: %d\n", demo(a, 5));//

    return 0;
}

小结

在这里插入图片描述

第46课 - 指针与堆空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>

int main()
{
    char c = 0;
    int i = 0;
    float f = 2.0f;
    double d = 3.0;

    void* p = NULL;

    double* pd = NULL;
    int* pi = NULL;

    /* void* 指针可以保存任意类型的地址 */
    p = &c;
    p = &i;
    p = &f;
    p = &d;

    printf("%p\n", p);

    // void* 类型的指针无法访问内存中的数据
    // printf("%f\n", *p);

    /* void* 类型的变量可以直接合法的赋值给其他具体数据类型的指针变量 */
    pd = p;
    pi = p;

    // void* 是例外,其他指针类型的变量不能相互赋值
    // pd = pi;

    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* p = malloc(4); // 从堆空间申请 4 个字节当作 int 类型的变量使用

    if( p != NULL )  // 如果申请失败 p 为 0 ,即:空值
    {
        *p = 100;

        printf("%d\n", *p);//100

        free(p);
    }

    p = malloc(4 * sizeof(int));

    if( p != NULL )
    {
        int i = 0;

        for(i=0; i<4; i++)
        {
            p[i] = i * 10;
        }

        for(i=0; i<4; i++)
        {
            printf("%d\n", p[i]);
        }

        free(p);
    }

    return 0;
}
/*
100
0
10
20
30
*/

小结

在这里插入图片描述

第47课 - 指针专题经典问题剖析

在这里插入图片描述

 #include <stdio.h>
#include <stdlib.h>

int main()
{
    int a = 0;
    int b = 1;

    int* p = &a;  //p指向a
    int** pp = &p;//pp指向p

    **pp = 2;   // a = 2;

    *pp = &b;   // p = &b;  

    *p = 3;     // b = 3;

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[] = {1, 2, 3, 4};
    int* pa = a;

    int b[2][2] = {{1, 2}, {3, 4}};
    // int** pb = b;  // b 的类型绝对不是 int**  warning: initialization of 'int **' from incompatible pointer type 'int (*)[2]'

    int (*pnb) [2] = b;  // b 的类型是 int(*)[2]

    printf("a = %p, pa = %p\n", a, pa);
    // printf("b = %p, pb = %p\n", b, pb);
    printf("b = %p, pnb = %p\n", b, pnb);

    return 0;
}
/*
a = 000000000061FE00, pa = 000000000061FE00
b = 000000000061FDF0, pnb = 000000000061FDF0
*/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int getDouble(double** pp, unsigned n)
{
    int ret = 0;
    double* pd = malloc(sizeof(double) * n);

    if( pd != NULL )
    {
        printf("pd = %p\n", pd);
        *pp = pd;
        ret = 1;
    }

    return ret;
}

int main()
{
    double* p = NULL;

    if( getDouble(&p, 5) )
    {
        printf("p = %p\n", p);

        free(p);
    }

    return 0;
}
/*
pd = 00000000006E5CB0
p = 00000000006E5CB0
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int b[2][2] = {{1, 2}, {3, 4}};
    int (*pnb) [2] = b;  // b 的类型是 int(*)[2]
    *pnb[0] = 10;//*(pnb[0])
    *pnb[1] = 30;

    printf("b[0][0] = %d\n", b[0][0]);
    printf("b[0][1] = %d\n", b[0][1]);//30
    printf("b[1][0] = %d\n", b[1][0]);
    printf("b[1][1] = %d\n", b[1][1]);

    return 0;
}
/*
b[0][0] = 10
b[0][1] = 2
b[1][0] = 30
b[1][1] = 4
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int b[2][2] = {{1, 2}, {3, 4}};
    int (*pnb) [2] = b;  // b 的类型是 int(*)[2]
    *pnb[0] = 10;
int * k=pnb[0] +1;//??  pnb[0] +sizeof(*pnb[0])对了 
 *k= 20;
  //  *pnb[1] = 30;
printf("sizeof(pnb) = %d\n", sizeof(pnb));
printf("sizeof(pnb[0]) = %d\n", sizeof(pnb[0]));
printf("sizeof(*pnb) = %d\n", sizeof(*pnb));
printf("sizeof(*pnb[0]) = %d\n", sizeof(*pnb[0]));
printf("pnb=%p\n",pnb);
printf("pnb[0]=%p\n",pnb[0]);
printf("pnb[0]+1=%p\n",pnb[0]+1);

printf("sizeof(b) = %d\n", sizeof(b));
printf("sizeof(int[2]) = %d\n", sizeof(int[2]));

    printf("b[0][0] = %d\n", b[0][0]);
    printf("b[0][1] = %d\n", b[0][1]);//30
    printf("b[1][0] = %d\n", b[1][0]);
    printf("b[1][1] = %d\n", b[1][1]);

    return 0;
}
/*
sizeof(pnb) = 8
sizeof(pnb[0]) = 8
sizeof(*pnb) = 8
sizeof(*pnb[0]) = 4
pnb=000000000061FE00
pnb[0]=000000000061FE00
pnb[0]+1=000000000061FE04
sizeof(b) = 16
sizeof(int[2]) = 8
b[0][0] = 10
b[0][1] = 20
b[1][0] = 3
b[1][1] = 4
*/

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int* func()
{
    int var = 100;

    return &var;
}

int main()
{
    int* p = func();  // OOPS!!!!
                      // p 指向了不合法的地址,这个地址处没有变量存在
                      // p 是一个野指针,保存不合法地址的指针都是野指针

    printf("*p = %d\n", *p);

    *p = 200;   // 改变 func 函数中局部变量 var 的值,是不是非常奇怪???

    printf("*p = %d\n", *p);

    return 0;
}

小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工信部中小企业局一行莅临盘古信息调研指导

近日&#xff0c;中小企业数字化转型城市试点调研交流活动在广东东莞举行&#xff0c;工业和信息化部中小企业局副局长商超&#xff0c;广东工业和信息化厅二级巡视员张振祥&#xff0c;工业和信息化部中小企业局创业创新处处长李海涛&#xff0c;东莞市委常委、副市长刘光滨&a…

canvas如何让单行文本用...省略

let strWidth ctx.measureText(this.data.name).width; const ellipsis "..." const ellipsisWidth ctx.measureText(ellipsis).width; if(strWidth<120 || 120<ellipsisWidth) {ctx.fillText("测试:"this.data.name, 190*dpr,590*dpr); }else {va…

(上位机APP开发)调用华为云属性修改API接口修改设备属性

一、功能说明 通过调用华为云IOT提供的属性修改API接口,给设备下发属性修改消息。 API接口地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html 此接口支持在线调试:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/doc?api=UpdatePrope…

基于Java微信小程序火锅店点餐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

基于电商模式的性能测试(2) —— 使用Jmeter参数化功能+JSR223 PreProcessor+JSON Extractor完成注册登录的数据驱动

1、前置条件 此例使用的是GitHub上一个开源的电商项目mall&#xff0c;需要的可以去GitHub上下载部署&#xff0c;有详细的部署教程&#xff1a; GitHub地址&#xff1a;github.com/macrozheng/…部署教程&#xff1a;macrozheng.github.io/mall-learni… 2、场景抽离 首先要…

全国首场以AI数字内容风控为主题的大会正式官宣,首批演讲嘉宾和议题揭晓!

曾经我们感叹的“AI迎来了iPhone时刻”&#xff0c;如今已变成“iPhone迎来了AI时刻”。前段时间&#xff0c;苹果全球开发者大会的召开&#xff0c;以及闻声而起的资本市场&#xff0c;无一不再次佐证了AI的无穷想象。 从OpenAI直播演示GPT-4o和谷歌的I/O开发者大会2024&…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

【ai】tx2 nx :安装torch、torchvision for yolov5

torchvision 是自己本地构建的验证torchvision nvidia@tx2-nx:~/twork/03_yolov5/torchvision$ nvidia@tx2-nx:~/twork/03_yolov5/torchvision$ python3 Python 3.6.9 (default, Mar 10 2023, 16:46:00) [GCC 8.4.0] on linux Type "help", "copyright",…

乐鑫ESP32-WROOM-32E模组设备低功耗控制方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正迅速成为我们日常生活的一部分。而在这个领域中&#xff0c;ESP32-WROOM-32E模组以其卓越的性能和多功能性&#xff0c;成为了开发者和制造商的选择。 ESP32-WROOM-32E模组集成了ESP32-D0WD-V3芯片&#…

迁移学习——CycleGAN——循环一致性对抗网络

CycleGAN 1.导入需要的包2.数据加载&#xff08;1&#xff09;to_img 函数&#xff08;2&#xff09;数据加载&#xff08;3&#xff09;图像转换 3.随机读取图像进行预处理&#xff08;1&#xff09;函数参数&#xff08;2&#xff09;数据路径&#xff08;3&#xff09;读取文…

NAS安全存储怎样实现更精细的数据权限管控?

NAS存储&#xff0c;即网络附属存储&#xff08;Network Attached Storage&#xff09;&#xff0c;是一种专用数据存储服务器&#xff0c;其核心特点在于将数据存储设备与网络相连&#xff0c;实现集中管理数据的功能。 NAS存储具有以下明显优势&#xff0c;而被全球范围内的企…

vncsever ,window 远程ubuntu远程界面安装方式,VNC Viewer安装教程+ linux配置server 操作

linux 端安装 # 安装VNC 服务器软件 sudo apt install autocutsel # 剪切黏贴操作支持的包 sudo apt-get install tightvncserver # 安装的是 VNC 服务器软件,用于远程桌面访问 # 安装Xfce桌面环境 sudo apt-get install xfce4 xfce4-goodies #安装的是 XFCE 桌面环境和其…

EXCEL表格怎么批量删除日期后的时间?

竞价师最近有点忙了&#xff0c;因为百度新出来一个“线索有效性诊断”功能 一、下载电话、表单、咨询表格 二、选中整列 三、选中ctrlf 进行替换&#xff0c;日期输入空格&#xff0c;时间输入*&#xff0c;替换为空即可&#xff01; 四、整列单元格格式“日期”拉倒底部&…

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容&#xff0c;文本三剑客都是针对文本内容。 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 awk&#xff1a;按行取列 一、grep grep的作用使用正则表达式来匹配文本内容 1、grep选项 -m&#xff1a;匹配几次之后停止…

知识付费小程序源码系统 构建知识交易新平台 带完整的安装代码包+搭建部署教程

系统概述 随着互联网技术的不断发展&#xff0c;人们获取信息的方式发生了巨大改变。传统的知识传播方式已经无法满足人们日益多样化的需求&#xff0c;知识付费逐渐成为一种趋势。同时&#xff0c;移动互联网的普及使得小程序成为人们生活中不可或缺的一部分&#xff0c;利用…

拓扑排序-体育课测验(二)

目录 一、问题描述 二、解答思路 三、代码实现 四、刷题链接 一、问题描述 二、解答思路 拓扑排序&#xff1a; 1.设置一个入度数组&#xff0c;构建图的邻接矩阵的同时对入度数组进行初始化 2.执行结点个数次的循环&#xff0c;每次循环都统计入度数组中的入度为0的结点P&…

如何以管理员身份运行CMD?

好久没更新博客了&#xff0c;今天在日常使用中遇到了一个问题&#xff0c;顺便记录下来。 据说国内的谷歌浏览器 Chrome 可以自动升级了&#xff0c;终于不用每次都自己跑去官网下载最新版本&#xff0c;然后安装迁移&#xff0c;重复劳动。下一篇讲如何讲迁移 Chrome&#x…

面试-java并发与多线程的部分函数

1.sleep和wait的区别 基本的差别&#xff1a; Sleep是Thread的方法。Wait是object方法。Wait不传参&#xff0c;最终也是调用wait(native)的传参方法。 Sleep方法可以在任何地方使用。 Wait方法只能在synchronized方法或synchronized方法块中使用。 最主要的本质区别&#xf…

pdf压缩,pdf压缩在线,pdf文件太大怎么变小

在数字化时代&#xff0c;PDF文档因其跨平台、保持原样、易于阅读和打印等特点&#xff0c;成为了我们日常工作和生活中不可或缺的一部分。然而&#xff0c;随着PDF文件的不断累积&#xff0c;存储空间逐渐变得紧张&#xff0c;特别是在处理大量大型PDF文件时&#xff0c;如何有…

qlv格式转换成mp4格式,qlv转换成mp4格式软件工具转换器

在当今的互联网时代&#xff0c;视频格式转换已成为我们日常生活中的一项常见任务。其中&#xff0c;qlv转MP4的需求尤为突出&#xff0c;本文将详细介绍qlv转MP4的几种方法&#xff0c;帮助大家转换视频格式&#xff0c;我们一起来看下。 方法一&#xff1a; 1、使用 "小…