iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言指针引用数组案例讲解
  • 494
分享到

C语言指针引用数组案例讲解

2024-04-02 19:04:59 494人浏览 泡泡鱼
摘要

前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在

前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~

      当在程序中定义一个变量时,系统会根据其数据类型为其开辟内存空间,例如Visual c++为整型变量分配四个字节的空间,为单精度浮点型变量分配四个字节,为字符型变量分配一个字节,内存中每个字节都有自己独立且唯一的一个编号,这就是地址 ,如下图,系统为变量i分配了2000~2004的存储单元。

在这里插入图片描述

_访问变量的方式_有如下图两种:
第一种直接访问方式,直接通过变量名访问,变量名与地址有一一对应关系,因此按此地址直接对变量i的存储单元进行访问;
第二种间接访问方式,先通过i_pointer找到i的地址的位置,再通过i的所存地址的位置找到i的地址2000,随后对变量i进行存取操作。间接访问的方式就要用到指针,所谓指针(2000)即为一个变量的地址,指针变量(i_pointer)是存储这个地址的用来指向另一个对象的变量。

关键字 变量类型
int 整型变量
char 字符变量
类型名* 指针变量

它们之间的关系为:指针变量的值是指针,指针是变量i的地址,变量i存放所需要存放的存储内容。
图片的中*为取值运算符,*i_pointer表示对i_pointer中存放的地址进行取值,相当于 变量i。

在这里插入图片描述

指针的定义:

基类型 *变量名
例:int *p
char *p
float p
注意 : 此时的
与上文中提到的取值运算符并不是一个概念,此时的
*意思是定义一个变量,这个变量是指针变量。

指针的引用:

对指针进行赋值:
以下面程序为例:

int *p;
int a = 3;
p = &a;
*p = 2;

p = &a(&为取地址符,意思是取变量a的地址赋给指针变量P)
*p = 2(p上文中已经提到是对指针变量P中存储的地址进行取值p相当于变量a,对
*p进行赋值即相当于对变量a进行赋值)

指针变量做函数参数

以定义两个变量a和b,使其值进行交换为例进行阐述


#include<stdio.h>

//值传递
void swap1(int x, int y) {
	int z;
	z = x;
	x = y;
	y = z;
}

//地址传递 
void swap2(int *p1, int *p2) {
	int t = *p1;
	*p1 = *p2;
	*p2 = t;
}

 
//void swap3(int *p1, int *p2) {
//	int *t;
//	*t = *p1;
//	p1 = *p2;	//报错 
//	p2 = *t;
//}

 
void swap4(int *p1, int *p2) {
	int *t = NULL;
	t = p1;
	p1 = p2;
	p2 = t;
}

int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	
	swap1(a, b);
	printf("%d %d\n", a, b);
	
	int *p1 = &a, *p2 = &b;
	
	swap2(p1, p2);
	printf("%d %d\n", a, b);
	
	swap4(p1, p2);
	printf("%d %d\n", *p1, *p2);	//注:在swap2()函数中,a b的值发生了交换 
	
	return 0;	
}

 

指针指向数组

盆友们一定要记住这两句话再往下看***!!!***
首地址:一段内存空间的第一个存储单元,而不是第一个字节;
指针变量的加减:以指针指向的类型空间为单元进行偏移;

以定义一个数组,输入数值,最后输出数组中所有元素为例进行阐述



#include<stdio.h>
int main() {
	int a[5];
	
	//下标法
	for(int i = 0; i < 5; i++) 
		scanf("%d", &a[i]);				//等价于scanf("%d", a + i);
	int *p, *p1;
	
	p = a;								//等价于p = &a[0] 
	p1 = &a[0];
	
	for(int i = 0; i < 5; i++)
		printf("%d ", a[i]);
	printf("\n");

	//指针法
	
	
	*/
			
	for(int i = 0; i < 5; i++) 
		printf("%d ", *(p + i));		
	printf("\n");
	
	//a为指针常量不能改变,变的是 a + i本身 
	for(int i = 0; i < 5; i++) 
		printf("%d ", *(a + i));		
	printf("\n");
	
	//指针p在不断移动,因此在学习的过程中要时刻注意指针的位置!!! 
	for(int p = a; p < (a + 5); p++)
		printf("%d ", *p); 
	return 0; 
}


#include<stdio.h>

void swap(int a[], int n) {
	int h = 0, t = n - 1, m = (n - 1) / 2;
	for(h; h <= m; h++) {
		int tmp = a[h];
		a[h] = a[t];		//根据须知3: a[h]等价于*(a+h) 
		a[t] = tmp;
		t--;
	}
}

void swap1(int *x, int n) {
	int *p, *i, *j;
	i = x;
	j = x + n - 1;
	p = x + (n - 1) / 2;

	for( ; i <= p; i++, j--) {
		int tmp = *i;
		*i = *j;
		*j = tmp;
	}
}

int main() {
	int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
	for(int i = 0; i < 10; i++) 
		printf("%d ", a[i]);
	printf("\n"); 
	swap(a, 10);
	for(int i = 0; i < 10; i++) 
		printf("%d ", a[i]);
	printf("\n");
		
	swap1(a, 10);
	for(int i = 0; i < 10; i++) 
		printf("%d ", a[i]);
	printf("\n");
	return 0;	
} 
 

指针指向 二维数组

在这里插入图片描述

a[3][4]数组的结构:
三个一维数组
四个int类型的元素

**
再次强调:
1.指针变量的加减:以指针指向的类型空间为单元进行偏移;
2.数组名代表数组元素的首地址

a是二维数组名,指向的第一个存储单元是a[0]这个一维数组,a的类型是指向一维数组的指针常量, a+1即偏移一个一维数组;
a[0],a[1], a[2]是一维数组名,代表一维数组中的元素的首地址,也就是说a[0]的值是&a[0][0],a[1]的值是&a[1][0],a[2]的值是&a[2][0]。    a[0],a[1], a[2]分别指向的第一个存储单元是a[0][0], a[1][0], a[2][0]这几个元素,它们的类型是指向元素的指针常量,a[0]+1即偏移一个元素;

为了让大家看清除,博主以表格形式展示出来:

首地址 指向 类型 移动一位 移动字节数
二维数组的首地址a a[0]这个一维数组 int(*)[4] a+1 16B
以为数组的首地址a[0] a[0][0]元素 int* a[0]+1 4B

指针指向二维数组的各种表现形式


#include<stdio.h>
int main() {
	int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
	 
	printf("%d %d\n", a, *a);			//a:表示0行首地址	  *a:表示0行0列元素的地址	二者的值一样,但是指针类型不同					 
	printf("%d %d\n", a[0], *(a + 0));			 
	printf("%d %d\n", &a[0], &a[0][0]);	 
	printf("%d %d\n", a[1], a + 1);
	printf("%d %d\n", &a[1][0], *(a + 1) + 0);
	printf("%d %d\n", a[2], *(a + 2));
	printf("%d %d\n", &a[2], a + 2);
	printf("%d %d\n", a[1][0], *(*(a + 1) + 0));
	printf("%d %d\n", *a[2], *(*(a + 2) + 0));
	return 0;
}

 

指向二维数组的指针变量


#include<stdio.h>
int main() {
	int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
	
	 
	int *p;
	for(p = a[0]; p < a[0] + 12; p++) {
		printf("%2d ", *p);
		
	}
	printf("\n\n");
	
	 
	int (*q)[4] = a;				//指针变量p指向4个整形元素的一维数组 
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 4; j++) {
			printf("%2d ", *(*(q + i) + j));
		}
	}
	 
	return 0;
} 

用指向数组的指针做函数参数


#include<stdio.h>
//指向变量的指针变量
void avg(float *p, int n) {
	float sum = 0, ans = 0;
	float *p1 = p + 11;
	for(p; p <= p1; p++)
		sum = sum + *p;
	ans = sum / n;
	printf("%.2f\n", ans);
}
//指向一维数组的指针变量
void search(float (*p)[4], int n) {
	for(int i = 0; i < 4; i++) {
		printf("%.2f ", *(*(p + n) + i));
	}
}
int main() {
	float score[3][4] = {78, 90, 89, 34, 91, 61, 71, 84, 67, 76, 100, 53};
	avg(*score,12);	 
	search(score, 2);		 
	return 0;
}

指针指向 三维数组

在这里插入图片描述

a[2][3][4]数组的结构:
两个二维数组
三个一维数组
四个int类型的元素

首地址 指向 类型 移动一位 移动字节数
a a[0]这个二维数组 int(*)[3][4] a+1 48B
a[0] a[0][0]这个一维数组 int(*)[4] a[0]+1 16B
a[0][0] a[0][0][0]元素 int * a[0][0]+1 4B

指针指向 多维数组

原理与二维数组三维数组一样
取元素的值:

在这里插入图片描述

到此这篇关于C语言指针引用数组案例讲解的文章就介绍到这了,更多相关C语言指针引用数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言指针引用数组案例讲解

本文链接: https://www.lsjlt.com/news/135574.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言指针引用数组案例讲解
    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在...
    99+
    2022-11-12
  • C语言例题讲解指针与数组
    目录1.概要复习2.指针与数组笔试题2.1一维数组2.2字符数组2.3字符串数组2.4字符串指针2.5二维数组1.概要复习 本篇的内容主要围绕指针与数组、指针与字符串等之间的关系,以...
    99+
    2022-11-13
  • C语言指针数组案例详解
    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。 1.指...
    99+
    2022-11-12
  • C语言详细讲解指针数组的用法
    目录1. 指针数组定义方法2. 指针的指针(二级指针)3. 字符串和指针4. 数组指针定义方法数组指针的用法1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] in...
    99+
    2022-11-13
  • C语言零基础讲解指针和数组
    目录一、指针和数组分析-上1.数组的本质2.指针的运算3.指针的比较4.小结二、指针与数组分析-下 1.数组的访问方式2.下标形式 VS 指针形式3.a 和 &a ...
    99+
    2022-11-13
  • C语言详细讲解数组参数与指针参数
    目录一、C语言中的数组参数退化为指针的意义二、二维数组参数三、等价关系四、被忽视的知识点五、小结一、C语言中的数组参数退化为指针的意义 C 语言中只会以值拷贝的方式传递参数 当向函数...
    99+
    2022-11-13
  • C语言结构体指针案例解析
    写结构体指针前,先说一下 . 号和 -> 的区别 记得当初刚学C语言的时候,搞不清结构体的 . 号和 -> ,经常混淆二...
    99+
    2022-11-12
  • C语言中指针的使用案例
    这篇文章主要介绍C语言中指针的使用案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、利用指针倒序字符串void _reversal(char* left, char* ri...
    99+
    2023-06-29
  • c语言 指针零基础讲解
    1.指针是什么(可能有点难理解) 指针的是啥? 指针实际上就是地址,地址就是系统给定的编号,编号就是一个个内存单元。 在某种情况来说指针=地址=编号=内存单元。 指针就是地址,顾名思...
    99+
    2022-11-13
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2022-11-13
  • c语言的指针数组详解
    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p;...
    99+
    2022-11-12
  • C语言详细讲解多维数组与多维指针
    目录一、指向指针的指针二、二维数组与二维指针三、数组名四、小结一、指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向...
    99+
    2022-11-13
  • C语言数组指针和指针数组怎么应用
    这篇文章主要介绍“C语言数组指针和指针数组怎么应用”,在日常操作中,相信很多人在C语言数组指针和指针数组怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数组指针和指针数组怎么应用”的疑惑有所帮助!...
    99+
    2023-06-30
  • C语言 指针数组进阶详解
    目录指针与数组中的sizeof与strlensizeofstrlen数组名1、一维数组整型数组字符数组指针数组2、二维数组指针笔试题 笔试题1笔试题2笔试题3笔试题4笔试题...
    99+
    2022-11-13
  • C语言超详细讲解指向函数的指针
    目录一、函数的指针二、指向函数的指针变量三、调用函数的两种方式四、指向函数的指针的作用五、用指向函数的指针作函数参数(重点)六、为什么要将指向函数的指针变量作为函数的形参(重点)一、...
    99+
    2022-11-13
  • C语言指针和数组应用实例分析
    这篇文章主要介绍“C语言指针和数组应用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言指针和数组应用实例分析”文章能帮助大家解决问题。一、指针和数组分析-上1.数组的本质数组是一段连续的...
    99+
    2023-06-30
  • C语言超详细讲解函数指针的运用
    目录前言计算器的例子回调函数转移表前言 前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直...
    99+
    2022-11-13
  • C语言如何使用数组指针与函数指针
    这篇文章主要为大家展示了“C语言如何使用数组指针与函数指针”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何使用数组指针与函数指针”这篇文章吧。函数指针语法定义一个函数指针,并通过函数指针...
    99+
    2023-06-29
  • go语言数组指针怎么引用
    在Go语言中,数组是值类型,当数组作为参数传递给函数时,会进行值拷贝。如果需要在函数中修改数组内容并保持修改后的结果,可以使用数组指...
    99+
    2023-10-25
    go语言
  • C语言超详细讲解指针的使用
    目录指针概述自身类型指向类型代码例子数值型指针字符型指针单字符字符数组字符串型指针字符数组总结指针概述 C语言中指针也可以认为是一种类型,不同于数值型和字符型的类型。推演过去指针变量...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作