C语言基础——指针、指针数组、二级指针_c语言指针、二级指针、数组指针-程序员宅基地

技术标签: 算法  c++  c语言  

指针,又称为指针变量。指针保存的是地址。指针所指向的对象可以是变量,数组,函数等占据存储空间的实体。
现在举一个例子:

#include <stdio.h>
#include <string.h>
int main()
{
    
	char a[] = "Computer Science";//定义一个字符串
	int i;
	char *p = a;//定义一个指针变量
	for(i = 0; i < strlen(a); i += 2)
	{
    
		printf("%c", *(p + i));
	}
	printf("\n");
}

这个例子就初步的表达了指针在数组中的应用,在这里值得一提的是 p=a[0],剩下的就浅显易懂了。

指针数组,数组元素全为指针变量的数组称为指针数组,指针数组比较适合用来指向若干个字符串。
现在举一个指针数组在二维数组中的应用:
题干是:用指针数组处理一个二维数组,求出二维数组所有元素的和

#include <stdio.h>
int get_sum(int (*p)[4], int n)//定义指向有四个整型数数组的指针
{
    
	int i, j, sum = 0;
	for(i = 0; i < n; i++)//常规的二维数组的for循环结构
	{
    
		for(j = 0; j < 4; j++)
		{
    
			sum += p[i][j];
		}
	}
	return sum;//返回值为 sum
}
int main()
{
    
	int array[3][4]={
     {
    7, 10, -2, 3},
			{
    14, 30, 6, -15},
			{
    0, 5, 27, -7} };
	int sum = get_sum(array, 3);//引用get_sum函数
	printf("sum is %d\n", sum);
}

现在再举一个字符型指针数组的例子:
题干是:定义字符指针数组char *str[5]分别指向5 个字符串常量,从小到大输出字符串的内容


#include <stdio.h>
#include <string.h>
int main()
{
    
	char *s[5] = {
    "yang", "li", "liu", "wang", "zhang"};//字符型指针数组;*s[5]定义一个有5个指针的数组,该指针是指向一个字符串
	int i, j;
	for(i = 0; i < 5 - 1; i++)
	{
    
		for(j = 0; j < 5 - i - 1; j++)
		{
    
			if(strcmp(s[j], s[j + 1]) > 0)//比较字符串大小的时候,只需要比较两个字符串不同的第一个字母的顺序
			{
    	//交换
				char *t;//定义一个新的指针
				t = s[j];
				s[j] = s[j + 1];
				s[j + 1] = t;
			}
		}
	}
	for(i = 0; i < 5; i++)
		printf("%s\n", s[i]);
}

二级指针(int ** p),指向一个指针变量的指针,用于存放二级指针的变量称为二级指针变量

**q = *p = a
*q = p = &a
q = &p

简单体会下,二级指针的本质。

#include <stdio.h>
int main()
{
    
	int a = 10;
	int *p = &a;
	int **q = &p;
	printf("**q %d, *p %d,  a %d\n", **q, *p, a);
	printf("*q %p, p %p, &a %p\n", *q, p, &a);
	printf("q %p, &p %p\n", q, &p);
	**q = 20;
	printf("**q %d, *p %d,  a %d\n", **q, *p, a);
}

本次在这里简单的总结了指针、指针数组、二级指针的知识点,和相关原理。只是用了一些简单例子讲解了下,在后续还会挑一些专属的经典例子放进来。如果有错误,还望评论纠正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46059646/article/details/126296895

智能推荐

【雕爷学编程】Arduino 手册之三角函数 sin()_arduino sin-程序员宅基地

文章浏览阅读928次,点赞3次,收藏11次。sin() 是 Arduino 数学库中的一个函数,它的作用是计算一个角度的正弦值。Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。可以使用 sin() 函数和反正弦函数 asin() 来计算每秒钟物体沿着圆周移动的弧长对应的弧度值,然后除以 PI 得到相对于圆心的角度变化。在使用sin()函数计算角度的正弦值时,确保输入的角度值在正确的范围内。_arduino sin

用Servlet+jsp+mysql写项目时,使用C3p0连接池连接数据库,启动服务出现以下错误:mysql APPARENT DEADLOCK!!!-程序员宅基地

文章浏览阅读566次。用Servlet+jsp+mysql写项目时,使用C3p0连接池连接数据库,启动服务出现以下错误:mysql APPARENT DEADLOCK!!!控制台出现的异常如下:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@536b0935 – APPARENT DEADLOCK!!! Complete Stat..._mysql apparent deadlock

【计算机考研】 408大题怎么复习最有效?看这一篇!_408大题怎么准备-程序员宅基地

文章浏览阅读882次,点赞8次,收藏23次。24变化较大的是选择题,出现了很多冷门知识点。当然,考试不是一成不变的。时间长了,考试的形式、内容都会变。光靠过去的题目,有可能漏掉新题型,到时候就傻眼了。考研408大题虽然整体来看难度和往年相识,但是每年还是会出一些新考点,例如今年的计网BGP,所以最重要的还是掌握知识点。再说了,考试可不只是考你知识储备,更考的是综合能力和解题方法。这些东西可不是光靠做题就能练出来的,得花点心思,多想想,多琢磨琢磨。光凭做真题,你可别指望能应付得了所有情况。总的来说,真题固然重要,但可不能当成唯一标准。_408大题怎么准备

使用 for 和 mv 批量修改文件名_mv批量修改文件名-程序员宅基地

文章浏览阅读375次。命令一次只能操作一个文件或者目录,如果现在我有好几个文件甚至好几百个文件需要处理,是不是就不能用。(这里只有 9 个文件,想一个一个修改也不是不可以。稍微修改一下上面的指令,使输出的文件名转换成指定的格式,即把文件名中的。命令,允许用户创建一个遍历一系列值的循环,以此来重复执行一系列命令。参数不是必须的,完全可以省略,只是为了跟直观地看一下修改的过程而已。编辑器可以根据命令来处理数据流中的数据,这正是我们所需要的。先看测试目录下的文件,这里有 9 个。的文件,需要把他们的文件名都改成。_mv批量修改文件名

CodeForces 554C 组合数学_codeforces 554c a题-程序员宅基地

文章浏览阅读469次。题意K种不同颜色的N个球,要求每种颜色最后一个球的位置必须按照顺序来。求有多少种排列方法。题解排列规则比较简单,首先放最后一个球,这个球一定放在最后一个空位,放完最后一个球之后,其他的a[i]-1个球随便放。按照排列规则计算一下即可。这里用到了一个小技巧,组合数打表。感觉还是挺实用的。代码#include #include#include#_codeforces 554c a题

EduCoder-程序设计技术R-指针-(第1关:用指针法输入12个整数,然后按每行4个)(第2关:指针变量作为函数参数实现两变量交换值)(第3关:报数)(第4关:strcmp函数)_第1关:用指针法输入12个整数,然后按每行4个数输出-程序员宅基地

文章浏览阅读6.2k次,点赞8次,收藏44次。目录第1关:用指针法输入12个整数,然后按每行4个代码示例第2关:指针变量作为函数参数实现两变量交换值代码示例第3关:报数代码示例第4关:strcmp函数代码示例第1关:用指针法输入12个整数,然后按每行4个任务描述题目描述:用指针法输入12个整数,然后按每行4个数输出####相关知识(略)####编程要求请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。输入输入包含一行,有12个整数。输出按顺序,每行输出4个整数。####测试说明样例输入:1 2 3 4 _第1关:用指针法输入12个整数,然后按每行4个数输出

随便推点

printf的实现,my_printf_my_printf.h-程序员宅基地

文章浏览阅读623次。1 #ifndef __PRINT_H_ 2 #define __PRINT_H_ 3 4 void print(char* fmt, ...); 5 void printch(char ch); 6 void printdec(int dec); 7 void printflt(double flt); 8 void printbin(_my_printf.h

LUA教程算术运算的Metamethods-52_bad argument #1 to 'pairs-程序员宅基地

文章浏览阅读1.7k次。这一部分我们通过一个简单的例子介绍如何使用metamethods。假定我们使用table来描述结合,使用函数来描述集合的并操作,交集操作,like操作。我们在一个表内定义这些函数,然后使用构造函数创建一个集合:Set = {}function Set.new (t) local set = {} for _, l in ipairs(t) do set[l] = true end return setend function Set.union (a,b) .._bad argument #1 to 'pairs

微信小程序ar识别_微信小程序识别物品弹出ar动画-程序员宅基地

文章浏览阅读836次。ar识别示例库代码片段_微信小程序识别物品弹出ar动画

深度学习之基本概论(1)-程序员宅基地

文章浏览阅读321次,点赞4次,收藏3次。深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。

C++编译器优化问题-程序员宅基地

文章浏览阅读1k次。首先使用a拷贝构造了形参aa,然后aa拷贝构造了copy1,copy1拷贝构造了copy2(注意这里虽然是等号也是拷贝构造,因为这里的copy2还是对象创建初始化阶段,只有对象创建出来之后再给对象赋值才是赋值)copy2拷贝构造了一个临时对象然后传参给test,使用这个临时对象1拷贝构造了aa然后aa重复上面再函数中的拷贝构造,返回值,因为是值返回所以先再main函数的栈帧内开辟一个临时对象2,调用了一次拷贝构造,然后再用哦这个临时对象2,拷贝构造了ret对象。所以编译器进行了优化,那么优化的地方在哪呢?._c++编译器优化

1-径向基(RBF)神经网络PID控制器仿真_rbf神经网络整定的pid控制器设计-程序员宅基地

文章浏览阅读328次。1-可以交流、咨询、答疑。_rbf神经网络整定的pid控制器设计