C语言_指针

2023-10-30

@C语言指针@指针
这个要从直接访问与间接访问说起,在程序中一般通过变量名来引用变量的值,程序通过编译后就会把变量名转化为变量的地址,通过地址对数据进行存取操作。这种方式称为直接访问,而间接访问是将变量i的地址存放在另一变量中,然后通过该变量来找到变量i的地址,从而访问i变量。这就引入了指针。
#指针和指针变量
1)一个变量的地址称为该变量的"指针"。
2)一个变量专门用来存放另一变量的地址,则称这个变量为’‘指针变量’’。
3)指针是一个地址,而指针变量是存放地址的变量。

#include<stdio.h>
int main()
{
	int a = 100,b = 10;
	int *pointer_1,*pointer_2;
	pointer_1 = &a;
	pointer_2 = &b;
	printf("a=%d,b=%d\n",a,b);
	printf("*printer_1=%d,*printer_2=%d\n",*printer_1,*printer_2);
	return 0;	
}
//运行结果:
a = 100,b = 10;
*pointer_1=100,*pointer_2=10

注:pointer_1与pointer_2出现了俩次,意义不一样。
1 定义时,"*"只是表示该变量是指针变量,
2输出时,*pointer_1与 *pointer_2则代表指针变量pointer_1和pointer_2所指向的变量。
表示"指向",pointer_1表示指针变量pointer_1所指向的变量。pointer_2同理。
##定义指针变量
格式: 类型名 * 指针变量名;
eg: int * pointer_1, * pointer_2;
1)指针变量是基本数据类型派生出来的类型,它不能离开基本类型而独立存在。
2)指针变量前面的
表示该变量的类型为指针型变量。
3)在定义指针变量时必须指定基类型,(原因:指针变量中存着地址,当取数据时可以根据地址(指针)找到变量的首地址,但是并不知道取几个字节呀,这时候就会根据指定的基类型取几个字节的数据。)
4)指向某种基类型就读做某种类型+指针 eg: int指针
5)指针变量中只能存放指针(地址),不要将一个整数赋给一个指针变量(臣妾做不到啊)
##引用指针变量
1)给指针变量赋值。
p=&a; //把a的地址赋给指针变量p
2)引用指针变量指向的变量。
printf("%d",
p); //以整数形式输出指针变量p所指向的变量的值。

  • p = 1;//表示将整数1赋给p当前所指向的变量,如果p指向a,则相当于a的值为1了。
    3)引用指针变量的值。
    printf("%o",p); //以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址。
    4)注意俩个运算符 取地址运算符(&)与指针运算符(*).
    ##指针变量作为函数参数
#include <stdio.h>
int main()
{
void swap(int *p1,int *p2);//对swap函数的声明
int a,b;
int *pointer_1,*pointer_2;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
pointer_1 = &a;//使pointer_1指向a
pointer_2 = &b;//同理
if(a<b) swap(pointer_1,pointer_2);
printf("max=%d,min=%d\n",a,b);
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//运行结果
//please enter a and b : 5,9
//max=9.min=5
//这段程序是改变了内存中a,b的值,而没有改变指针变量的值。

##通过指针引用数组
数组元素的指针就是数组元素的地址。可以用一个指针变量指向一个数组元素。

int a[10] = {1,3,5,7,9,11,13,15,17,19};
int *p;
p=&a[0];

引用数组的基本方式
1)数组名不代表整个数组,只代表数组首元素的地址。而指针就是地址。
2)在一定条件下允许对指针进行加减的运算。就引用数组而言,当指针指向数组元素时可以对指针进行下面四类运算
1.加一个整数(用+或+=),如p+1;
2.减一个整数(-或-=),如p-1;
3.自加运算 p++,++p;
4.自减运算p–,--p;
3)若p1与p2都指向同一数组元素时,俩个指针可以相减。
4)执行p+1时并不是将p的值简单的加一,而是加上一个数组元素所占用的字节数
5)系统怎么知道把这个1转化为4,然后与p的值相加呢?在定义指针变量时要指定基类型,系统会根据p的基类型判断占几个字节数,然后乘几。
6)引用数组中各元素的值
1.下标法,编译系统将a[i]转化为*(a+i)处理,即:先计算元素地址,找出元素 的值
2.通过数组名计算数组元素的地址,找出元素的值。
3.用指针变量指向数组元素。用指针变量直接指向元素,不必每一次都重新计算地址,能大大提高执行效率。
7)两种方式比较:
1.下标法:比较直观知道是第几个元素。
2,用地址法或者指针变量的方法不直观,很难判断出当前处理的是哪一个元素。

#include<stdio.h>
int main(){
	int a[10];
	int *p,i;
	printf("please enter 10 integer numbers:");
	for(i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	for(p=a;p<(a+10);p++){
		printf("%d",*p);
	}
printf("\n");
return 0;
}

8)可以通过改变指针变量的值指向不同的元素。
想输出a数组的100个元素,可以使用这段代码

p=a
while(p<a+100)
printf("%d",*p++);

##数组名作函数参数

  • C语言调用函数时虚实结合的方法都是采用’‘值传递’'方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。

  • 可以这样理解,有一个形参数组,它从实参数组那里得到起始地址,因此形参地址与实参地址共占同一段内存单元,在调用函数期间,如果改变了形参数组的值,也就改变了实参数组的值。

  • 实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,按指针变量处理。
    ##通过指针引用多维数组
    int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};

  • a代表的是首行的首地址。a+1代表序号为1的行的首地址。

  • a[0]代表一维数组a[0]中第0列的元素的地址。即&a[0][0]

  • a[0]+1的值代表的是一维数组中序号为1的元素的首地址。

  • *(a+i) 和a[i]是等价的。

  • a+1是二维数组a中序号为1的行的首地址(序号从0算起),而*(a+1)
    并不是a+1单元的内容,因为a+1并不是一个变量的存储单元,也就谈不上它的存储内容了。(a+1)就是a[1],而a[1]是一维数组名,所以也是地址,它指向a[1][0].a[1]和(a+1)都是二维数组中地址的不同表达形式。

  • &a[i]或a+i指向行,而a[i]或*(a+i)指向列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言_指针 的相关文章

  • 智能学习

    智能学习 MATLAB实现TLBO教学学习优化算法的图像特征提取 目录 智能学习 MATLAB实现TLBO教学学习优化算法的图像特征提取 基本介绍 模型描述 程序设计 参考资料 基本介绍 MATLAB实现TLBO教学学习优化算法的图像特征提
  • python语法-MySQL(DDL数据定义)

    python语法 MySQL数据库 sql语言的分类 DDL数据定义 DML数据操作 DCL数据控制 DQL数据查询 SQL的语法特征 1 sql语言大小写不敏感 2 sql可以单行或者多行书写 最后以 号结束 3 sql支持注释 单行注释

随机推荐

  • 找不到mybatis的mybatis-config.xml配置文件

    初学mybatis出现过好几次找不到配置文件的问题 今天练习一个小项目又出现这个问题 排查了之前出现的错误 都没有解决问题 后来发现是自己粗心大意 把从mybatis官网中复制的调用生成mysqlsessionFactory的代码直接复制过
  • 【Ei检索】2022年计算语言学和自然语言处理国际会议(CLNLP 2022)

    2022年计算语言学和自然语言处理国际会议 CLNLP 2022 重要信息 会议网址 www clnlp org 会议时间 2022年12月16 18日 召开地点 中国北京 截稿时间 2022年10月31日 录用通知 投稿后2周内 收录检索
  • GridView编辑删除操作

    第一种 使用DataSource数据源中自带的编辑删除方法 这种不常用 在这里就不加说明了 第二种 使用GridView的三种事件 GridView1 RowEditing 编辑 GridView1 RowUpdating 更新 GridV
  • 胡小明:城市大脑与人脑不同的数据意识

    一 数据应用要区别对待 1 2 数据应用比数据收集重要 大数据热正在席卷全国 许多地方政府都成立大数据局 统管政府的数据资源并将数据收集摆在第一位 数据应用研究却迟迟跟不上 投资不断增长应用效益却无相应增长 大数据收集已经得不偿失 应用效益
  • 【STM32】IAP

    首先先明白几个概念 IAP In applicating Programing 在应用编程 ICP In Circuit Programming 在线编程 我自己理解的话 ICP就是平时用仿真器直接下载程序的方式 应用程序直接从FLASH的
  • wireshark过滤规则

    wireshark是一款抓包软件 常用来分析网络底层协议 寻找网络安全问题 平时用的最多的是过滤功能 wireshark的过滤分功能有两种 抓包过滤器和显示过滤器 抓包过滤器的过滤规则分为四个部分 放行 类型 协议和逻辑运算符 方向 src
  • Jmeter性能测试面试基础问答

    性能测试基础 简述实施软件性能测试的流程 a 性能需求分析 挑选用户使用最频繁的功能来做测试 比如 登陆 搜索 提交订单 确定性能指标 比如 事务通过率为100 90 的事务响应时间不超过5秒 并发用户为1000人时CPU和内存的使用率在7
  • 自动化测试很难吗?是的,难。?

    其实现在软件测试有一个特别奇怪的现象 那就是每个人在一起进入这个圈子的时候 他想的就是我要自动化测试 我要学会自动化 自动化会替换手工测试 很多这种心声 我在这给大家来分析一下 首先为什么很多人在入这个圈的时候 会听到 这种声音 比如 学好
  • C语言例题讲解(if语句,循环语句,函数)

    目录 if语句例题 题目分析 代码 题目总结 循环语句例题 题目分析 代码 题目总结 函数例题 题目分析 代码 题目总结 if语句例题 计算1 1 1 2 1 3 1 4 1 5 1 99 1 100 的值 打印出结果 题目分析 1 首先我
  • LinkList集合详解

    LinkList集合详解 1 LinkedList简介 LinkedList类是一个继承于AbstractSequentialList的双向循环链表 它是非同步的 也是非线程安全的 LinkedList实现了List接口 能对它进行队列操作
  • 在elementUI中sort-orders排序,默认为三种,怎么改成两种

    在 table表单中添加sort change事件 sort orders ascending descending
  • 解决:同样的Python程序,在cmd和pycharm都能正常运行,但是在Visual Studio Code却报错,且`conda activate`命令无法激活或切换虚拟环境

    解决 同样的Python程序 在cmd和pycharm都能正常运行 但是在Visual Studio Code却报错 且 conda activate 命令无法激活或切换虚拟环境 1 软件环境 2 问题描述 3 解决方法 4 结果预览 1
  • Linux 文本处理工具 - sed(用于过滤和转换文本)

    Linux 文本处理工具 sed 用于过滤和转换文本 文章目录 Linux 文本处理工具 sed 用于过滤和转换文本 一 简介 二 常用参数 三 动作说明 四 实例 p 显示 d 删除 a 添加 c 替换 w 把符合的行写到指定文件中 i
  • Code-server 云服务器配置docker 运行

    Code server 云服务器配置docker 运行 1 docker安装 安装需要的软件包 yum utils device mapper persistent data lvm2 yum install y yum utils dev
  • android httpClient 支持HTTPS的2种处理方式

    问题 项目中Android https或http请求地址重定向为HTTPS的地址 相信很多人都遇到了这个异常 无终端认证 javax net ssl SSLPeerUnverifiedException No peer certificat
  • Redis学习笔记

    目录 一 redis前言 1 1 Redis简介 1 2 主要特点 1 3redis 的windows安装后 1 4 修改Redis配置文件 二 redis常用数据类型 三 redis常用命令 1 字符串操作命令 2 哈希操作命令 3 列表
  • python爬虫,wallhaven热门壁纸多线程采集下载源码

    新年新气象 祝大家牛转乾坤 牛气冲天 过年期间收到了很多朋友的新年祝福 没有一一回应 见谅 很久没写爬虫了 手生了 在吾爱找了一个练手网站 国外的壁纸网站 wallhaven 这里采集下载热门图片为例 重温一下python图片爬虫 感兴趣的
  • Veeam 备份还原操作手册

    目录 一 安装Bakup Replication 1 1 选择 Backup Replication 1 2 选择Install安装 二 添加VC主机 2 1 VMWARE VSPHERE 添加 2 2 VC主机名 2 3 用户认证 三 配
  • Linux I/O多路复用——epoll模型实现服务端Socket通信

    目录 epoll模型 epoll函数 epoll create epoll ctl epoll wait 程序流程 水平触发 LT 边沿触发 ET select poll epoll对比 为什么ET模式下 需要将套接字设置为非阻塞式 epo
  • C语言_指针

    C语言指针 指针 这个要从直接访问与间接访问说起 在程序中一般通过变量名来引用变量的值 程序通过编译后就会把变量名转化为变量的地址 通过地址对数据进行存取操作 这种方式称为直接访问 而间接访问是将变量i的地址存放在另一变量中 然后通过该变量