c语言指针入门

2023-11-20

1.指针是什么

  (1)概念

  指针是一种十分重要的数据类型,利用指针变量可以直接对内存中各种不同数据结构的数据进行    快速处理.

(2)指针与内存的关系


指针与内存有着密切的联系,为了正确理解指针的概念,必须弄清楚计算机系统中数
据存储和读取的方式。首先需要区分三个较为相近的概念:名称、地址和内容(值))。名称
是给内存空间取的一个容易记忆的名字:内存中每个字节都有一个编号,这就是“地址“,在地址所对应的内存单元中存放的数值即为内容或值。在计算机中,所有的数据都是存放
在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型质占用的
内存单元数不等,若在程序中定义了变量,在对程序进行编译时,系统就会为这些变量分
配与变量类型相符合的相应长度空间的内存单元。

例如:

Visual C++ 6.0 和 C-Free3.5 中:

int型指针 :4个字节

char型指针:1个字节

double型指针:8个字节

short int 型指针:2个字节

(2)访问方式

1.间接访问:将变量的地址存放在一种特殊的变量中(我们这里讲的指针),借用这个特殊变量进行访问。

2.直接访问:用变量明对变量进行访问的方式为直接访问的方式,也可称作按变量地址直接存取的方式。

2.指针的定义和初始化

1.定义:

定义格式为:类型说明符*变量名

            例如:int*p;char*p;double*p;

其中:p是一个指针变量,它的值是个地址,int*表示p是一个整型类型的指针,在这里*是一个类型说明符。

2.初始化

初始化包括定义和赋值

初始化的方式:

(1)int a;

    int*p=&a;

(2)int a; int*p;

    p=&a;

注意:不能直接把一个数赋予指针变量,如:int*p;p=100;是错误的。

           被赋值的指针变量前不能再加 * 说明符,如:*p=&a;是错误的.

(3)区分int*p和printf("%d",*p);中的*,前者*是类型说明符,后者是取值运算符,表示p这个地址里面存储的值。

3.运算符的优先级和有关指针的计算和应用

(1)优先级

1.首先取地址符&和取值运算符*的优先级是一样的,并且结合性都是自右向左,

所以 假设有&a,且int*p;p=&a;则   &(*p)=&*p=&a

2.++和*的优先级相同,结合方向都是自右向左

所以*p++和*(p++)是等价的,由于++在p的右侧,是先使用后加一,因此先对p原值进行*运算,

然后改变p的值。

(2)有关指针的计算和应用

1.通过指针变量求两个整数的和与积

#include<stdio.h>
int main()
{
int a=10,b=20,s,j,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
j=*pa**pb;
printf("a=%d\nb=%d\na+b=%d\na*b=%d\n",a,b,a+b,a*b);
printf("s=%d\nj=%d\n",s,j);
return 0;
}

 
程序中第 3 行定义了两个整型指针变量 pa 和 pb;第 4、5 行分别给指针变量 pa赋变
量 a的地址,给指针变量 pb 赋变量 b 的地址;第 6 行是求 a+b(*pa就是 a,*pb 就是 b);
第7 行求 a×b,第8行和第 9行输出 a+b 和 a×b的结果。

2.通过指针变量求三个整型数中的最大数和最小数

#include<stdio.h>
int main()
{
	int a,b,c,*max,*min;
	printf("请输入三个整数:");
	scanf("%d%d%d",&a,&b,&c);
	if(a>b)
	{
		max=&a;
		min=&b;
	}
	else
	{
		max=&b;
		min=&a;
		if(c>*max)max=&c;
		if(c<*min)min=&c;
		printf("max=%d\nmin=%d\n",*max,*min);
	}
	return 0;
}



 

 程序中第 3 行定义了两个整型指针变量 max 和 nint第 4.行为输入提示;第5行输入
3个数字,接着判断前两个数的大小,在 max 变量中存放较大数的地址,min变量中存放
较小数的地址;然后再将第 3个数与以上较大数和较小数进行比较,从而得到3个数中的
最大数和最小数并将其输出。

(3)指针变量作为函数的参数

题目:输入a和b两个整数,按照先后大小的顺序输出。

#include<stdio.h>
void arr(int*pa,int*pb)//定义一个函数arr使a为最大值 
{
	int t;
	t=*pa;
	*pa=*pb;
	*pb=t;
}
int main()
{
	int a,b;
	int *pa,*pb;
	pa=&a;
	pb=&b;
	scanf("%d,%d",pa,pb);//接收数字,将数字存放到地址pa,pb中 
	if(a<b)
	arr(pa,pb);
	printf("%d,%d",a,b);
	return 0;
}

4.指针和普通数组的联系

(1)数组的地址

数组的地址指的是数组的起始地址,这个起始地址也称为数组的指针。

数组的起始地址=数组名=数组的首元素的地址。

例如:

int arr[5]={1,2,3,4,5},*p;

在这里*p=arr和*p=&arr[0]是等价的

(2)访问数组的方式

1.用下标法访问数组

#include<stdio.h>
int main()
{
	int arr[5],i;
	printf("请输入5个整数:");
	for(i=0;i<5;i++)
	scanf("%d",&arr[i]);
	for(i=0;i<5;i++)
	printf("%d\n",arr[i]);
	return 0;
}

2.用数组名访问数组

#include<stdio.h>
int main()
{
	int arr[5],i;
	printf("请输入5个整数:");
	for(i=0;i<5;i++)
	scanf("%d",&arr[i]);
	for(i=0;i<5;i++)
	printf("%d\n",*(arr+i));
	return 0;
}

 

3.用指针变量访问数组

#include<stdio.h>
int main()
{
	int arr[5],i;
	int*p=arr;
	printf("请输入5个整数:");
	for(i=0;i<5;i++)
	scanf("%d",&arr[i]);
	for(i=0;i<5;i++)
	printf("%d\n",*(p+i));
	return 0;
}

由此可见上面三种访问方式的运行结果都是一样的,所以数组和指针是密切相关的。

注意:第三个例子中*(p+1)中的p+1并不是简单的将地址加1,而是指向数组的下一个元素,

而地址的变化要根据数组的类型来确定,比如int型数组每个元素相差4个字节,而char型每个元素相差一个字节。

(3)利用指针来定义一个数组

有时候我们也可以利用指针来定义一个数组

例如:利用字符型指针定义一个字符型数组

#include<stdio.h>
#include<string.h>
int main()
{
	char*str="i like studying";
	int i,length;
	length=strlen(str);
	for(i=0;i<length;i++)
	{
		printf("%c\n",str[i]);
	}
	return 0;
}

5.指针数组

1.定义

指针数组是一个用来存放指针变量的数组

一般形式为:类型* 数组名[元素个数],如下

int*arr[5];

int*代表它是一个存放int型指针变量的数组,arr是数组名,arr[5]代表arr数组里有5个int型指针变量.

2.初始化

我们这里举个简单的例子来说明

#include<stdio.h>
int main()
{
	int a=1,b=2,c=3;
	int*p[3]={&a,&b,&c};//指针数组的初始化
	int i;
	for(i=0;i<3;i++)
	{
		printf("%d\n",*p[i]);
	}
	return 0;
}

 注意:指针数组必须存放的是指针变量,不能是数字或者字母。

3.有关指针数组的题目

题目:用一个函数计算有n个元素的指针数组s中最长的字符串的长度。

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
int max_len(char*s[],int n)
{
	int i;
	int max;
	max=strlen(s[0]);//先设最长的字符串就是指针数组的第一个元素 
	for(i=0;i<n;i++)//用循环逐一和max比较选出最长的元素 
	{
	if(strlen(s[i])>=max)
	max=strlen(s[i]);}
	return max;//返回最长字符串的长度 
}
int main()
{
	int max,n,m,p;
	printf("输入字符串的个数:");
	scanf("%d",&n);
	printf("请输入%d个字符串:",n);
	char*s[p]={NULL};
	for(m=0;m<n;m++)//利用循环给指针数组赋值 
	{
		s[m]=(char*)malloc(sizeof(char)*p);//开辟动态内存空间 
		scanf("%s",s[m]);
	}
	max=max_len(s,n);
	printf("%d\n",max);
	return 0;
}
	

温馨提示:这里所讲的内容只是指针中的基本部分,指针还有许多知识点。还有如果有错误的地方,欢迎各位大神留言喔,大家一起学习进步吧。

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

c语言指针入门 的相关文章

  • MSP430F5529库函数——模数转换模块(ADC12)软件触发

    需提前观看 MSP430F5529库函数学习 串口 目录 代码 ADC初始化部分 引脚复位 ADC12 A init 函数声明 baseAddress sampleHoldSignalSourceSelect clockSourceSele
  • 一种简单的计算item相似度算法

    计算item之间相似度是个有意义的工作 比如词的相似度就有很多应用场景 词相似度就有很多做法 工业上现在用得最多的可能是word2vec了 还有些算语义相似度的偏学术的办法 这里介绍一种比较简单可行的思路 不只是算词相似度 其他类型也可以
  • C语言深入学习--checklist4:宏、枚举、switch

    宏 1 宏的本质是什么 函数 语句 类型定义 或者其它 预编译器的文本替换 1 你知道语言设计者为什么设计宏吗 这些原因目前是否成立 在 C程序中 可以用宏代码提高执行效率 宏代码本身不是函数 但使用起来象函数 预处理器用复制宏代码的方式代
  • 频率与补偿(下)

    该章节为频率与补偿 下 本文选自Research on Damping Factor Control Frequency Compensation 和Research on Multistage Amplifier Frequency Co
  • 采用ATL模型代替lib dll 的调用

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 为WCE SDK下的例子 转为win32 自己移植 http www rayfile com zh cn files c638241c df8

随机推荐

  • slabinfo解读

    文件 proc slabinfo统计slab分配器相关信息 如 cat proc slabinfo slabinfo version 1 1 kmem cache 65 70 108 2 2 1 ip fib hash 10 112 32
  • 什么是批处理?

    什么是批处理 当需要向数据库中插入大批量数据时 在批处理之前 要执行100条sql 就只需100此打开连接关闭连接和网络传输 批处理过程 将大量的SQL打包成一个批次 发送给服务器 服务器接收数据 打开批 一次执行批里的sql 这样减少与数
  • ELM数据处理和调参经历 调参方法

    After I build the ELM model class I should find the best result for my data The most important thing to do is to process
  • Python 数据分析——Matplotlib相关知识

    Python 数据分析 Matplotlib相关知识 第五章 Matplotlib相关知识 样式 文章目录 Python 数据分析 Matplotlib相关知识 前言 一 matplotlib的绘图样式 style 1 matplotlib
  • 淘宝镜像使用方法

    淘宝镜像使用方法 方法一 临时使用 npm registry https registry npm taobao org install 依赖包 上面语句是临时使用淘宝镜像安装 依赖包 方法二 永久使用 npm config set reg
  • 啥是Redis的缓存穿透、缓存击穿和缓存雪崩

    Redis缓存穿透 缓存击穿和缓存雪崩都是缓存机制中的一些问题 具体解释如下 缓存穿透 Cache Penetration 指查询一个不存在的数据 由于缓存中没有数据 所以这个查询请求会直接穿过缓存层 到达数据库层 造成了数据库的压力 攻击
  • KVM虚拟化技术的-NUMA技术和应用

    NUMA技术是解决多CPU共同工作的技术方案 多CPU共同工作主要有3中架构 SMP Symmetric Multi Processor 非统一存储访问结构 NUMA Non Uniform Memory Access 以及海量并行处理结构
  • 初识Linux(五)--vsftp的安装及常见错误

    安装 可以到官方网站去下载 http vsftpd beasts org 也可以用光盘安装 RedHat 5的安盘里自带的 所以我选择光盘安装 1 先把光盘挂载到系统上 mount dev cdrom mnt 这样光盘的内容就被挂载到 mn
  • xss-labs-master过关心得

    xss labs master通关心得 xss漏洞详解 XSS原称为CSS Cross Site Scripting 因为和层叠样式表 Cascading Style Sheets 重名 所以改称为XSS X一般有未知的含义 还有扩展的含义
  • 【Linux】Makefile中打印宏定义

    因为Makefile的嵌套关系 导致Makefile中很多宏定义是看不到的 有时编译时 会报找不到XXX h头文件 如果头文件在其他路径下 此时需要将头文件在Makefile中进行包含 那么不可能包含全路径 因为如果工程路径变化了 又会报找
  • IOS开发系列——异步绘制专题

    异步绘制专题 1 图片处理 1 1 编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把CGI
  • 通过php://filter/read=convert.base64-encode/resource= 利用LFI来查看源码

    PHP LFI读php文件源码以及直接post webshell 假设如下一个场景 1 http vulnerable fileincl example1 php page intro php 该php文件包含LFI漏洞 2 但是你没有地方
  • numpy中的argpartition

    numpy argpartition a kth axis 1 kind introselect order None 在快排算法中 有一个典型的操作 partition 这个操作指 根据一个数值x 把数组中的元素划分成两半 使得index
  • 性能测试之Jmeter集合点

    01 计数器 计数器就是按照设置可以为每个用户迭代时进行计数 可以用作参数化 jmeter计数器设置 没勾选与每用户独立跟踪计数时 计数器每用户每迭代都会往上增加数字 到最大时可重新开始 勾选与每用户独立跟踪计数器时 每个线程也就是用户会单
  • 毕业设计-基于机器视觉的数字图像处理技术研究-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 基于OpenCV数据库的程序环境构建 二 基于OpenCV的图像技术处理 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • 华为OD机试 - 最佳植树距离(Java)

    题目描述 按照环保公司要求 小明需要在沙化严重的地区进行植树防沙工作 初步目标是种植一条直线的树带 由于有些区域目前不适合种植树木 所以只能在一些可以种植的点来种植树木 在树苗有限的情况下 要达到最佳效果 就要尽量散开种植 不同树苗之间的最
  • Pandas基础知识入门

    Pandas是基于Numpy构建的含有更高级数据结构和工具的数据分析包 类似于Numpy的核心是ndarray pandas 也是围绕着 Series 和 DataFrame两个核心数据结构展开的 Series 和 DataFrame 分别
  • ALLEGRO等长时如何将PIN DELAY和VIA长度计算在内

    在PCB设计中 对于时序要求严格的线路 Via和IC pin delay的长度必须得到重视 通过下面的操作 可将Via和Pin delay加入到线路长度的计算中 1st 计算Pin delay 打开Constraint Manager 选择
  • c语言指针入门

    1 指针是什么 1 概念 指针是一种十分重要的数据类型 利用指针变量可以直接对内存中各种不同数据结构的数据进行 快速处理 2 指针与内存的关系 指针与内存有着密切的联系 为了正确理解指针的概念 必须弄清楚计算机系统中数 据存储和读取的方式