推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

C语言之指针与数组知识点随笔

   2023-08-01 网络整理佚名1660
核心提示:最近在学习c语言的指针与数组,在学习的过程中顺便把指针这章节的部分知识点简要的罗列下,以帮助理解记忆。在c语言中指针与数组的关系十分密切,通过数组下标所能完成的任何操作通过指针都可以实现。当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。这类运算是指针或地址运算中最简单的形式。c语言中的地址运算方法是一致且有规律的,将指针、数组和地址的算法运算集成在一起是c语言的一大优点。

点击上方“C语言中文社区”,选择“置顶公众号”,第一时间查看C语言笔记!

链接:https://www.cnblogs.com/chanboo/archive/2012/06/27/2564584.html

往期推荐


inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

C语言学习资源汇总【最新版】

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

开发C语言的3款神器,个人觉得第三款用着最香!

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

C语言实例:统计字符串中英文字母、空格、数字和其它字符的个数

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

【C语言】文件常用读写操作(含读取学生信息示例)

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

23 种设计模式的通俗解释,虽然有点污,但是秒懂

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

自从用了这个MarkDown编辑工具后,我把其它的MD工具都卸载了

inktype="2">
ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;">

【C语言】扫雷小游戏详解

ntent="t" data-mid="" style="margin-bottom: 14px;width: 516px;display: flex;align-items: center;justify-content: flex-start;flex-wrap: nowrap;font-size: 13px;font-weight: 400;color: rgb(122, 120, 191);line-height: 18px;border-bottom: none !important;">

inktype="2">C语言链表学生信息管理系统

最近在学习c语言的指针数组。 在学习过程中,我会在指针章节中简单列出一些知识点,以帮助理解和记忆。

“两个符号:”

1. 一元运算符 * 是间接寻址或间接引用运算符。 当它作用于指针时,就会访问指针所指向的对象。

2. & 是地址运算符。 它只能应用于内存中的对象,即变量和数组元素。 它不能作用于表达式、常量或类型变量。

“指针定义:”

指针是变量的一种类型,它是保存变量地址的变量。

指针和地址

通常,机器具有一系列连续编号或寻址的存储单元,可以单独或按连续组操作这些存储单元。 通常情况下,机器的一个字节可以存储一个char类型的数据,两个相邻的字节存储单元可以存储一个short(短整型)类型的数据,四个相邻的字节存储单元可以存储一个long(长整型)类型的数据。 指针是一组可以保存地址的内存位置(通常是两个或四个字节)。

简单的例子:

1 int a = 1, b = 2, c[10];
2 int *p;            
3 p = &a;          
4 b = *p;          
5 *p = 0;          
6 p = &c[0];     

注意:

指针只能指向某种类型的对象,即每个指针必须指向某种数据类型。 void 类型指针可以存储指向任何类型的指针,但不能引用自身。

“运算符优先级:”

一元运算符 * 和 & 的优先级高于算术运算符。 以a = *p + 1的形式,取出*p指向的对象的值并加1,然后将结果赋给a。 而*p += 1就是将p指向的对象的值加1。

*p += 1 ++*p 或 (*p)++ 一元运算符遵循从右到左的关联顺序。

最后补充一点:

由于指针也是一个变量,因此可以在程序中直接使用,无需间接引用。

指针和函数参数

由于C语言将参数值按值传递给被调用函数,被调用函数不能直接修改调用函数中变量的值,即使想修改,也只是修改变量参数的副本的值。

搜索公众号C语言中文社区,后台回复“资源”,免费获得200G编程资料。

 1 
 2 void swap(int x, int y)
 3 
{
 4      int temp;
 5      temp = x;
 6      x = y;
 7      y = temp;
 8 }
 9 
10 
11 void swap(int *px, int *py)
12 
{
13      int temp;
14      temp = *px;
15      *px = *py;
16      *py = temp;
17 }

从上面的例子得到的总结:指针参数使得被调用函数能够访问和修改调用函数中对象的值。

指针和数组

在C语言中,指针和数组的关系非常密切,任何能通过数组下标完成的操作都可以通过指针来实现。 用指针编写的程序比用数组下标编写的程序执行得更快。

整数a[10]; 首先定义一个长度为10的数组a,即10个对象的集合,这些对象存储在相邻的内部区域中,名称分别为a[0],a[1]...a[9]。 a[i] 可以表示为数组的第 i 个元素。

整数*pa; 这里声明了一个指向整数类型的指针,

pa = &a[0]; 表示pa指向数组a的第0个元素,也就是说pa的值为数组a[0]的地址。

x = *pa; 将数组 a[0] 的内容复制到变量 x 中。

如果pa指向数组pa = &a[i]中的特定元素,则pa+1将指向下一个元素,pa+i将指向当前数组之后的第i个元素,pa-i将指向到当前数组元素之前的第 i 个元素。

因此,如果pa指向a[0],则*(pa+i)指的是数组a[i]的内容,pa+i存储的是数组元素a[i]的地址。

执行pa = &a[0];后,pa和a的值相同,因为数组名代表数组第一个元素的地址,所以pa = &a[0] pa = a 而对于数组元素a[对 i] 的引用也可以写为 *(a+i)。

事实上,c语言中计算a[i]的值时,首先将其转换为*(a+i)的形式,然后进行求值。 如果在这两个等价表达式中加上地址运算符&,我们可以知道&a[i]和a+i的含义是相同的。

“总结:”

使用数组和下标实现的表达式可以等效地使用指针或偏移量实现。 指针是一个变量,所以在C语言中,pa = a和pa++是合法的。 但数组名不是变量,因此像 a = pa 和 a++ 这样的语句是非法的。

当将数组名传递给函数时,实际传递的是数组第一个元素的地址。 在被调用的函数中,参数是局部变量,因此数组名参数必须是指针,即存储地址值的变量。

1 
2 int strlen(char *s)
{
4        int n;
5        for (n = 0; *s != '\0'; s++)
6              n++;
7        return n;
8 }

在上面的例子中,s是一个指针,所以增加它是合法的。 指向 s++ 不会影响函数调用者中的字符串,它只会递增函数中指针的私有副本。

地址算术运算

如果p是指向数组中某个元素的指针,那么p++会对p进行自增操作,指向下一个元素,而p+=i会对p进行自增操作,通过添加i使其指向指针 p 的当前位置 所指向元素之后的第 i 个元素。 这种类型的算术是指针或地址算术的最简单形式。

C语言中的地址运算方法是一致的、有规律的。 C语言的一大优点是集成了指针、数组和地址的算术运算。

看下面的不完美分配存储过程:它由 2 个函数组成。 第一个函数alloc(n)返回一个指向n个连续字符存储单元的指针,alloc函数的调用者可以使用该指针来存储字符序列。 第二个函数 afree(p) 释放分配的存储空间以供以后重用。 这两个函数之所以“不完美”,是因为调用afree函数的顺序必须与调用alloc函数的顺序相反。 换句话说,alloc和afree以栈(即后进先出列表)的形式管理存储空间。

实现方法:首先让alloc函数在一个大字符数组中分配空间。 该数组是 alloc 和 afree 函数私有的。 由于函数alloc和afree处理的对象是指针而不是数组下标,因此调用函数不需要知道数组的名称。 这样就可以在包含alloc和afree的源文件中将数组声明为类型,使其对外界不可见。 在实际实现中,数组甚至可能没有名称,可以通过调用alloc函数或者向操作系统申请一个未命名存储块的指针来获得。

中的空间使用状况也是我们需要了解的信息。 我们使用指针指向 中的下一个空闲单元。 当调用 alloc 来请求 n 个字符的空间时,alloc 将检查数组中是否还有足够的空间。 如果还有足够的空间,则alloc返回的当前值(即空闲块的起始位置)将增加n,使其指向下一个空闲区域。 如果没有足够的可用空间,则 alloc 返回 0。如果 p 在 的范围内,afree(p) 只是将 p 的值设置为 p。

 1 #define ALLOCSIZE 1000 
 2 
 3 static char allocbuff[ALLOCSIZE];  
 4 
 5 static char *allocp = allocbuff;       
 6 
 7 char *alloc(int n)    
 8 
{
 9        if (allocbuff + ALLOCSIZE - allocp >= n) { 
10              allocp += n;
11              return allocp - n;
12        } else {     
13              return 0;
14        }
15 }
16 
17 void afree(char *p)    
18 
{
19        if (p >= allocbuff && p < allocbuff + ALLOCSIZE)
20                allocp = p;
21 }

一般来说,指针和其他类型的变量一样,是可以被初始化的。 一般来说,指针唯一有意义的初始化值是0或表示地址的表达式,在这种情况下,表达式表示的地址必须是先前定义的适当类型的数组的地址。

指针和整数不能相互转换,但0是唯一的例外:常量0可以赋值给指针,指针也可以与常量0进行比较。在程序中,经常使用符号常量NULL而不是常量0,这样方便明确说明常量0是指针的特殊值。

使用指针减法编写该函数的另一个版本。

1 
2 int strlen(char *s)
{
4       char *p = s;
5       while (*p != '\0')
6             p++;
7       return p - s;
8 }

在上面的程序段中,指针p被初始化为指向s,s指向字符串的第一个字符。 while循环语句会依次检查字符串中的每个字符,直到遇到标识符数组末尾的字符“\0”。 p是指向字符的指针,因此每次执行p++时,p都会指向下一个字符的地址,ps表示已经检查过的字符数,即字符串的长度。

有效的指针运算符包括:

版权申明:内容来源网络,版权归原创者所有。除非无法确认,都会标明作者及出处,如有侵权,烦请告知,我们会立即删除并致歉!

--- EOF ---

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON