【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主通过创建指针的指针,在不修改原来的程序结构的情况下,对原来指针的指向的值进行修改。

目录
相关文章
|
4天前
|
C语言
第一章 C语言知识点(程序)
第一章 C语言知识点(程序)
15 0
|
5天前
|
C语言
c语言指针总结
c语言指针总结
12 1
|
11天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
12天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
9 2
|
13天前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
|
13天前
|
C语言
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
C语言 浙大版《C语言程序设计(第3版)》题目集 练习8-8 移动字母 (10分)
|
13天前
|
C语言
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
|
13天前
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
13天前
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-6 删除字符 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-6 删除字符 (20分)
|
16天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)