黑马程序员——C语言笔记之指针

【C语言】指针 函数指针变量调用 函数指针数组 只读指针变量和只读变量指针 特殊指针 指针 函数指针变量调用 函数指针数组 只读指针变量和只读变量指针 特殊指针 阅读详情

------- android培训、java培训、iOS培训、.Net培训、期待与您交流! ----------

指针概念:

内存单元的编号也叫做地址。根据内存单元的编号或地址可以找到所需的内存单元,所以通常把这个地址称之为指针。

生活中实例:

银行账号是指针,卡里的钱是实际内容。

使用指针的好处:

  1. 为函数提供修改及调用变量的灵活手段
  2. 让函数有多个返回值
  3. 改善某些子程序的效率(传递的是一个地址而不是内容)
  4. 为动态数据结构(如二叉树、链表等)提供支持

指针是一个地址,是一个常量。

指针变量是存放一个地址,是一个变量。

定义格式:类型说明符 *变量名 = 地址;

指针也可以被声明为全局、静态局部和局部的。

指针的应用场景:1)在被调函数中可以修改主调函数中的变量的值。2)让函数可以有多个返回值。

#include <stdio.h>

void caculator(int x,int y,int *add,int *jian,int *cheng,float *chu){

    //在函数的内部访问了主调函数中的变量值
    *add = x+y;
    *jian = x-y;
    *cheng = x*y;
    *chu = x/(float)y;
    <pre name="code" class="plain">//用指针让函数可以有多个返回值,并不是有多个return
}int main(int argc, const char * argv[]) { int add=0; int jian=0; int cheng=0; float chu=0.0f; caculator(12, 4, &add, &jian, &cheng, &chu); printf("add = %d\n",add); printf("jian = %d\n",jian); printf("cheng = %d\n",cheng); printf("chu = %.2f\n",chu); return 0;}

 

二级指针概念:

如果一个指针变量存放的又是另一个指针变量的地址,则成这个指针变量为指向指针的指针变量,也称之为二级指针。

int a=10;
int *p=&a;//定义一个一级指针
int **p1=&p;//定义一个二级指针
printf("%p",&p);   //p的地址
printf("%p",p1);   //p1的内容,p的地址
printf("%p",*p1);  //p的内容,a的地址
printf("%d",*p);   //a的内容
printf("%d",**p1); //a的内容
在64位编译器中,任意指针变量都占用8个字节。

void *p; //可以将其强制转换成任意类型的指针


指针与数组

数组指针:

用一个指针变量指向一个数组元素,则它就是数组指针。

对于一个一维数组来说
        int a[5];

      1)获取 a[i]的地址有三种方法
          (1)&a[i] 

          (2)a+i   

          (3) int *p = a;
               p+i;
      2) 获取 a[i]的值有四种方法
         (1)a[i]         
         (2)*(a+i)
         (3) int *p = a;
              *(p+i);
         (4)*(&a[i])

数组指针的应用:逆序数组

#include <stdio.h>
/**
 *  逆序一个数组
 *
 *  @param a   数组名
 *  @param len 数组长度
 */
void nixuArray(int a[],int len){

    //定义数组指针
    int *p = a;
    
    //定义下标
    int i = 0,j = len-1;
 
    int temp;
    while (i<j) {

        //交换a[i]  和 a[j];
        temp = *(p+i);
        *(p+i) = *(p+j);
        *(p+j) = temp;
        
        //修改下标
        i++,j--;  
    }
}

int main(int argc, const char * argv[]) {
    
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    //调用函数逆序数组
    nixuArray(arr, 10);
    //遍历数组
    for (int i=0; i<10; i++) {
        printf("%d\t",arr[i]);
    }
    return 0;
}

二维数组指针

格式:数据类型 (*指针变量名)[二维数组列数]; 

p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 

int a[3][4];

int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]

数组指针也称指向一维数组的指针,亦称行指针,每次加i都是移动一行的地址的大小,而非移动一个元素的地址大小 


一维指针数组

概念:一个数组的元素值为指针则为指针数组

格式:类型说明符 *数组名[数组长度]


指针数组和二维数组指针的区别

指针数组:
int *pa[3]={&a,&b,&c}; // int *pa[3]={a[0],a[1],a[2]};
指针数组类型表示的是多个指针(一组有序指针),两边不能有括号。
二维数组指针:
int (*pa)[3];
二维数组指针变量是单个的变量,括号不能少。
int *p[3]; //表示p是一个指针数组,有三个下标变量p[0]、p[1]、p[2]均为指针变量
int (*p)[3]; //表示一个指向二维数组的指针变量。该二维数组的列数为3或分解为一维数组的长度为3


指针与字符串
字符串指针

char *变量名="字符串内容"; 

char *s="C Language";   则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。 

二维字符串指针

char st[3][6]={"china","japan","korea"}; 


指针与函数
指针函数

在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称之为指针型函数。
指针函数的定义:
      指针类型 * 函数名(){
 
          return 地址;
      }

函数指针

在C语言中,一个函数总是占用一段连续的内存区,而函数名就是其首地址,指向函数的指针变量称之为函数指针变量。
函数指针变量的定义
      返回值类型  (*变量名)(函数的参数);
函数的声明:
      int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
      定义了一个函数指针 p1 
      p1可以存放返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
函数指针的初始化
      p1 = sum;  //sum存的就是函数在内存中的首地址
#include <stdio.h>

int sum(int x,int y){
    return x+y; 
}

int jian(int x,int y){
    return x-y;  
}

int cheng(int x,int y){
    return x*y;
}

int chu(int x,int y){
    return x/y;
}

int main(int argc, const char * argv[]) {
    
    //函数指针的使用
    //1、定义函数指针
    int (*p)(int ,int );
    //2、给函数指针初始化
    p = sum;  //p也指向了sum函数
    
    switch (3) {
        case 1:
            p = sum;
            break;
        case 2:
            p = jian;
            break;
        case 3:
            p = cheng;
            break;
        case 4:
            p = chu;
            break;
            
        default:
            break;
    }
    
    //3、用函数指针间接的调用函数
    //     (*p)(23,45);
    int s = p(23,45);

    printf("%d\n",s);
    return 0;
}


汇川EASY系列之以太网通讯(MODBUS_TCP做主站) 汇川Easy系列以太网通讯中(MODBUSTCP,plc做主站),终于可以不用使用指令就可以完成了,全程通过简单的配置就可通讯。本文将通过EASY系列PLC与调试助手之间完成此操作。 阅读详情

相关推荐

SWD下载调试接口原理深度剖析

作为ARM嵌入式工程师,下载调试器都应该知道,但你真正了解SWD如何下载调试的么?ARM 芯片通过什么物理接口和什么方式连接完全取决于芯片Debug子系统的架构如何?

zhuwade的博客 1万+

指针

指针   1)为什么要使用指针?      a、指针的基本概念:         在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不同,如整型变量占4个单元,字符量占1个单元等,为了正确地访问这些内存单元,必须为每个内存单元编号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既

ITclody的专栏 615

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

黑马程序员—C语言笔记—指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

lan_wen963的专栏 741

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

【库卡机器人】接线步骤

准备X11插头接线,X11插头可以接入机器人外部安全回路接线,其中外部使能信号线也接在此接口上,如果机器人系统没有配置外部使能装置,那个此接口上的外部使能信号端须短接,短接规则为:20-21、23-22、31-30、33-32。持续按住使能键,保持使能上电状态,分别按住示教器右侧每个轴对应的+或-按键,测试机器人每一个轴是否能正常运行,如果一切正常,说明机器人控制正常,机器人可以正常使用。将一根黄绿色等电位线接入其中的一个接地端,并与机器人的接地端相连,使得控制柜与机器人等电位。

qq_45161762的博客 9440

黑马程序员——C语言学习笔记05 指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1、指针变量只能存储地址。指针就一个作用,能够根据地址值访问对应的存储空间。 2、定义指针 int *p; 3、给指针赋值 p =&num; 4、访问并修改指针变量p指向的存储空间*p = 1;   5、不同类型的指针变量所占内存空间的大小都是8个字节。   6、当

gjgoodjob271的博客 451

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

2024年7月1日接到安全部门同事邮件通知,目前生产环境及测试环境服务器Openssh存在远程代码执行漏洞(CVE-2024-6387),漏洞等级高,且攻击者可以成功利用该漏洞获得远程root shell最高权限从而执行任意代码及命令,主要受影响版本为8.5p1

菜鸟运维升级之路 2万+

[黑马程序员]06[C语言]指针部分笔记总结-01

------- android培训、java培训、IOS培训、期待与您交流! ---------- 1.    什么是指针 // 指针,即使pointer    // 我要去三里屯,给一张地图   // 指针== 地址   // 内存与内存地址(*****)   // 内存模型 // 就是一个一个并列的盒子,每一个盒子里值允许存放0或

astina2011的专栏 405

TMC22系列步进电机驱动设计:从静音原理到硬件实战

步进电机驱动是运动控制系统的核心,其性能直接影响设备的精度、噪音和效率。传统驱动方案如A4988采用方波控制,存在转矩脉动大、运行噪音高等问题。而高性能驱动通过优化电流波形与切换策略,从根本上提升了运动质量。其中,**StealthChop2**技术通过同步MOSFET开关与电机反电动势过零点,实现了近乎无声的低速运行;**SpreadCycle**模式则通过逼近正弦波的电流调节,优化了中高速动态性能。这些技术为3D打印机、CNC机床、自动化设备等对静音和精度有要求的场景提供了关键解决方案。本文以广泛应用的

weixin_31858171的博客 353

AI一键生成带货短视频:电商直播的未来

随着电子商务行业的快速发展,直播带货已成为一种极为有效的营销手段。然而,传统的人工直播方式存在诸多局限性,如人力成本高、主播培训周期长等问题。为了解决这些挑战,一种基于AI技术的一键生成带货视频解决方案应运而生——这就是“Anchor Crafter”。这项创新技术不仅能够自动创建高质量的带货视频,而且还能实现人物与商品之间的自然交互,极大地提升了用户体验。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2202

黑马程序员_C语言学习笔记之指针基础

1.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 2 指针的类型。   先列出一些指针的类型,简单的认识一下 (1)int *ptr; //指针的类型是int * (2)char *ptr; //指针的类型是char * (3)int **ptr; //指针的类型是 int ** (4)int (*ptr)[3]; //指针的类型是 in

MR____Wang的专栏 596

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(文末附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

AFSim2.9.0学习笔记 —— 1、AFSim及完整工具介绍(附:完整afsim2.9.0源码、编译好的完整工具包、中文教材等)

5175

【黑马程序员】C语言学习笔记之指针(十一)

--------------------------------------------IOS期待与您交流!-------------------------------------------- 一、什么是指针? 指针是用来存放变量地址的。通过指针可以间接操纵变量。 二、指针的定义 变量类型 *变量名; 如:int *p;定义了一个int类型的指针p。 注意:任何类型的指针都占据8个

kqygww的专栏 1162

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【黑马程序员】C语言学习笔记(2) - 指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------     指针是C语言提供的一种数据结构,其功能与一般的数据类型不一样的地方就在于它存储的是变量的内存地址。我对指针的概念理解如下图所示: 对应上图我们可以使用如下的代码来解释: #include int main() { int a = 11; int *p =

Little__Coder的博客 666

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

黑马程序员---c语言 指针的学习笔记

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-        指针  内存和地址的概念、 内存的地址都是用16进制的数表示的  指针就是个地址,程序运行,需要载入到内存中,因此内存所有的东西都是有地址的 取地址运算符& 获得变量在内存中的地址 取地址符%d 地址都是16位的二进制 数组,数组名就是地址 函

A1003052589的博客 548

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

黑马程序员---C 语言学习笔记之指针

------Java培训、Android培训、iOS培训、.Net培训-------- 10-01 指针   1.概念 内存单元的编号也叫地址,根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为【指针】   内存单元的指针和内存单元的内容是两个不同的概念。   2.使用指针的好处 a.为函数提供修改调用变量的灵活手段 b.可以改善某些子程序的效

chunhuayun的专栏 517

[黑马程序员]07[C语言]指针部分笔记总结-02

------- android培训、java培训、IOS培训、期待与您交流! ---------- 1.    指针运算(指针部分最难掌握的地方)(五颗星)   int main() {         // 指针的运算是指针难点的起源         // 指针的运算分为:     // 1>类型运算(强转)     // 将一个指针类型的变量强制

astina2011的专栏 419

黑马程序员----C 语言学习笔记之指针函数与函数指针

一、指针函数 1.返回指针的函数称为指针函数   2.指针函数的定义 一般形式为: 类型说明符 *函数名(形参表){ /*函数体*/ } 例如: //返回两个数中最大数的地址 int *sum(int a, int b){ return a > b ?&a : &b; } int *sum2(int *a, int *b){ ret

chunhuayun的专栏 330

黑马程序员——IOS学习笔记(C语言指针)

-----------android培训、java培训、IOS学习型技术博客、期待与您交流!------------           指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握。 什么是指针数组和指针函数指针 什么是指针: 存放变量地址的变量我们称之为“指针变量”,简单的说变量p中存储的是变量a

u012386336的博客 370

黑马程序员——ios学习笔记 C语言 指针的应用

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 指针数组  因为指针是变量,因此可设想用指向同一数据类型的指针来构成一个数组, 这就是指针数组。数组中的每个元素都是指针变量,根据数组的定义,指针数组中每个元素都为指向同一数据类型的指针。指针数组的定义格式为:  定义了一个指针数组,数组中的每个元素都是指向整型量的指针,该数组由10个

tt3tt3tt的博客 411

黑马程序员——ios学习笔记 C语言 指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 指针概念 所谓变量的指针, 实际上指变量的地址。变量的地址虽然在形式上好象类似于整数, 但在概念上不同于以前介绍过的整数, 它属于一种新的数据类型, 即指针类型。一般用指针来指明这样一个表达式&x的类型,而用地址作为它的值,也就是说, 若x为一整型变量, 则表达式&x的类型是指向整数的指针,

tt3tt3tt的博客 338

黑马程序员----C 语言学习笔记之数组指针与字符串指针

------Java培训、Android培训、iOS培训、.Net培训-------- 一、数组指针的概念及定义 1.数组指针 指向一个数组的指针。   2.作用 : 使用数组指针间接访问数组的元素   3.数组指针定义: int *p;   4.数组指针的初始化 Inta[] = {1,2,3,4}; Int *p = a;//数组指针的初始化

chunhuayun的专栏 578

12-黑马程序员------C 语言学习笔记--- C语言指针与函数

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------- 六 指针与函数 01 指针作为函数参数 指针作为实参时,与普通变量一样,也是采用单向的值传递方式,即将指针变量的值(该值是一个地址)传递给被调函数的形参...

weixin_34358092的博客 120

黑马程序员--C语言自学笔记---10字符串、指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1.   字符串输出 1)   以字符数组来存储字符串,输出时使用数组名以%s格式输出 printf(“%s\n”,str);str为字符数组名 2)   字符串从给定地址开始输出,遇到\0就停止 2.   字符串输入 1)        同样使用数组名来接收,使用%s格

Bright 510

黑马程序员——黑苹果的视频笔记(9)——指针(C语言)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1地址 每个存储单元都有唯一的 地址。 指针就是地址。 2指针概念 指针就是地址。 内存单元的指针和内存单元的内容不一样。 3、变量的存取方式 直接存取:变量的赋值和取值 间接存取:通过指针(地址)间接操作完成。 4指针

meacholxpf的博客 629
上一篇: 黑马程序员——C语言笔记之数组
下一篇: 黑马程序员——C语言笔记之结构体以及枚举
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值