【C语言程序设计】知识点汇总4——指针相关

简介: 【C语言程序设计】知识点汇总4——指针相关

7 指针


7.1基本概念

  • 指针:一个变量的地址
  • 指针变量:专门存放另一个变量地址的变量


定义:int *ptr这里的变量名时ptr,而不是*ptr.

指针变量的引用:

  • &a求变量a的地址
  • *a取指针所指向变量的内容


7.2 指针的运算

±运算:

  • 指针与整型值加减结果是指针,表示使该指针指向该指针下移或上移存储单元的个数。
  • 存储单元大小为指向变量的数据类型所需内存大小。
  • 指针与指针相加无意义
  • 指针之间相减为数据的个数


7.3 指针与数组

7.3.1 对数组元素的引用方法

  • 下标法
  • 指针法:
int a[10],*p,i;
p=a;
*(p+i)//访问对应a[i]元素,注意这里是指数组第i+1个元素


指针变量与数组名的区别:

指针变量的内容可以在程序执行过程中被改变,而数组名因为是一个地址常量,所以一旦其被定义,就无法改变


数组名做函数参数:

编程时都是将形参数组名作为指针变量来处理


7.3.2 指针与字符串

char *pstr;
char *pstr="hello world";
char *pstr;pstr="hello world";
//output
printf("%s",pstr);
printf("%c",*(pstr+i));


字符指针变量与字符数组的区别:

  • 前者存放的是地址(字符串的首地址)
  • 后者是由若干个元素组成,每个元素存放一个字符
//初始化
{
    char a[10];a="hello!";//这是错误的!因为把数组a看成指针,它的首地址是无法改变的。
  char *ps;ps="hello";//这是正确的
}
//访问,同数组相同
{
    printf("%c",a[2]);
}


字符指针数组定义后,必须先被赋值后使用;而定义一个字符数组即可马上使用。

{
    char a[10];gets(a);
    char *b;gets(b);//这是错误的,改为下方
    char *b;b=a;gets(b);
    //原因:我觉得是由于定义一个数组是需要在内存中开辟空间去存放,而定义一个指针则不需要开辟固定空间,so
}


7.3.3 指针和二维数组

本质在于二维数组可以看成一个一维数组,这个一维数组又是包含若干元素的一维数组;

{
    int a[2][3];
    //a[1]表示使第一行元素的首地址
    //特别强调,这里的二维数组的a与a[0]两者的基类型不同;a代表二维数组首元素的地址,首元素不是一个整型变量,而是一个由6个整型元素所组成的一维数组,因此a代表的是首行首地址。
}


(*)7.3.4 指向数组的指针(数组指针)与指针数组

1 指向数组的指针

特点:

  • 指向的数据类型是数组,而不是简单数据类型
int (*p)[4];
//本身是一个指针变量,其指向的数据类型是包含4个元素的数组,这个数组中的元素是int型


2 指针数组

特点:

  • 元素均为指针类型数据,其中每一个元素都相当于一个指针变量。
int *p[4];
//指针数组通常用来处理字符串问题


个人觉得和链表的结构有些相像,就是不用关注元素内部存储的细节,通过一个个指针对地址进行连接,实现了存储空间的高效利用。具体可以看看讲义的图表有助理解。


7.3.5 指向函数的指针与指针函数

1 指向函数的指针

这个地址就被称为函数的入口地址(指针),也就是说可以通过这个指针变量来调用这个函数。

int (*p)(int ,int);
//p是一指向函数的指针,这个函数中有两个参数其类型都是int型,同时这个函数的返回值是int型


{
    int max(int a,int b);
    int (*p)(int,int);//定义
    int a,b,c;
    p=max;//这是其中关键一步,赋值时,只给函数名
    。。。
    c=(*p)(a,b);//使用时括号不要丢了,丢了就变成指针了,不是指针指向的函数了
}


2 指针型函数

特点:

函数带回一个整型、字符值很常见,这里的不过就是带回的是指针罢了

int *a(int x,int y)
    //名称为a的函数中有两个参数,返回一个指向int类型的指针


7.3.6 指针的指针

本质就是指针指向的元素恰好是指针(地址),主要用来灵活的操作指针数组。

上次看了bilibili上有个up主通过创建指针的指针,在不修改原来的程序结构的情况下,对原来指针的指向的值进行修改。

目录
相关文章
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
63 16
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
77 18
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
57 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
52 10
|
1月前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
39 10
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
19 2
|
1月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
43 6
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1