iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言简析指针用途
  • 545
分享到

C语言简析指针用途

2024-04-02 19:04:59 545人浏览 安东尼
摘要

目录对象的访问方式什么是指针指针变量与指针相关的运算符指针变量作为函数参数数组与指针多维数组与指针指针常量 和 常量指针指针数组 与 数组指针字符串与指针函数指针二级指针 与 多级指

C语言中,任何一个变量,都有两层含义:

(1) 代表该变量的存储单元的地址;变量的地址 左值 lvalue

(2) 代表该变量的值;右值 rvalue

对于一个变量的访问,只有两种情况:

一是把一个值写到变量的地址中去 (lvalue)

二是从变量的地址中取变量的值 (rvalue)

对象的访问方式

直接访问 : 通过对象名去访问

如:

			int a;
			a = 1024;
			b = a; 

注:直接访问 受到作用域的限制

间接访问 :

通过对象的地址去访问,指针访问。

只要你知道了对象的地址,就可以在任何地方去访问它。

不受作用域的限制。

什么是指针

存储单元(如: memory 内存)的地址:

分配给每个对象的内存单元都有一个编号,这个编号就是我们所说

存储单元的地址。并且存储单元按照字节来编号。

在C语言中,指针的概念与地址差不多的,你可以直接认为指针就是一个地址。

一个变量的地址,我们也称为变量的“指针”

& 取地执符

单目运算符, “取xxx对象的地址”

通过一个对象的指针去访问它,首先要解决对象的指针(地址) 的保存问题。

需要定义另外的一个变量去保存它的地址,这种变量我们称为指针变量。

指针变量

指针变量也是一个变量,也是用来保存数据,只不过指针变量保存的数据是其他对象的地址。

指针变量的定义:

指向的对象的类型 * 指针变量名;

“指向的对象的类型” :

指针变量指向的对象的类型,而不是指针的类型。

如:

int *p;
int a=10;
p=&a;//p保存了对象a的地址 
	//  p 指向 a 

与指针相关的运算符

& : 取地址符

int a;

&a : 表示取对象a的地址

对象a的地址,其实就是对象a的指针。

* : 指向运算符  ,单目运算符 

*地址(*指针): 地址对应的那个变量(对象)。

int a=10;
int *p=&a;
int b=*&a;//b=10,int b=a

所以*(&a) <=> a

*& 可以直接约掉 (编译原理状态机的词法分析)

指针变量作为函数参数

传递的还是值!! 只不过这个“实参的值”可能是某个对象的地址!

C语言中,函数参数的传递只能是"值传递"

形参 = 实参的值

野指针:

void XXX2(int * m, int * n) 
		{
			int * t;//定义了一个指针变量t, 但是t没有被赋值
					//t没有赋值,但是不代表它没有值,相反它会有一个相对应的
					//不知道这个值是多少 undefine 
			*t = *m; //操作野指针,可能导致 段错误(对一个未知的空间进行写操作)
			*m = *n; 
			*n = *t; //操作野指针,可能导致 段错误(对一个未知的空间进行读操作)		

*t 放置到 ‘=’ 符号的左边,代表t指向对象的左值

对t的指向的对象进行写的操作

*t 放置到 ‘=’ 符号的右边,代表t指向对象的右值

对t的指向的对象进行read的操作

所以t是一个“野指针”,我们也不知道 t指向的内存空间是否可读可写,

如果不可读或者不可写,那么后续对*t操作,就会导致内存的非法访问 => 段错误!!

空指针:

NULL 0

在计算机中地址为0的存储空间是不存在的

如果一个指针的值,指向空(NULL)的指针,称之为空指针。

int *p=NULL;
*p=1024;//操作空指针
int b=*p;//操作空指针

我们去使用空指针,一定会 造成内存的非法访问 => 段错误

数组与指针

数组元素与普通变量是一样的,数组元素也有自己的地址。

数组元素也有左值和右值,并且数组元素间的地址是相邻的。

数组名可以代表首元素的地址。

a => &a[0], 数组名a当做指针来看

int a[]={1,2,3};
int *p=a;//a是数组名当指针来看,==&a[0]

指针作加减的问题:

能不能通过指针p去访问a[1]?

p=p+1;//&a[0]+1==&a[1]

p + i (p是一个指针,i是一个整数值)

注:不是简单地加减数值,而是加减i个指针指向单元的长度。

p + 1 => 往后面挪了一个int单元的长度 ,&a[1]

			int a[10]; 
			int * p = a; // p = &a[0]
			a[1] <=> *&a[1] <=> *(&a[0] + 1) <=> *(a + 1) <=> a[1] 
			a[1] <=> *&a[1] <=> *(&a[0] + 1) <=> *(p + 1) <=> p[1]

数组名a,在代码中有两层含义:

int a[10];

(1) 数组名代表整个数组

&a : 取整个数组a的地址。

&a + 1 : 往后面挪了1个(int[10])单元长度。

(2) 在合适情况下面,数组名可以当作指针来看

a <=> &a[0]

a + 1 : 当作指针来看

=> &a[0] + 1

=> &a[1]

多维数组与指针

在C语言中,所有的数组其实都是一维数组!

int a[3][4]; //int[4] a[3]; 

        表达式         表达式的含义                              表达式的值 
          a             数组名: 
                          (1) 当作指针 &a[0]                     取整个一维数组a[0]的地址 
                          (2) 当作整个数组来看       
          a[0]             数组名: 
                           (1) 当作指针 &a[0][0]                  取数组元素a[0][0]的地址 
                           (2) 当作整个一维数组a[0]来看 
          a[0][0]       数组元素a[0][0]                           a[0][0] (左值/右值)

 a + 1          a是数组名,在此处当作指针 ==&a[0]+1==&a[1]
 a[0] + 1       a[0] 是数组名,在此处当作指针 ==&a[0][0]+1==&a[0][1]
a[0][0] + 1       a[0][0]是二维数组a中的一个int类型的元素 ==a[0][0]+1
a[1] + 2         a[1]是数组名,此处当作指针 ==&a[1][0]+2==&a[1][2]
*(a + 1) + 2    a是数组名,在此处当作指针 ==*(&a[0]+1)+2==*(&a[1])+2==a[1]+2==&a[1][2]

指针常量 和 常量指针

他们都是指针,只不过他们之间的属性有一点区别。

指针常量:

指针本身不能改变(指针的指向不能变),但是

它所指向的内存空间里面的内容是可以改变的。

最具有代表性例子,数组名!

定义方式:

指向对象的类型 * const 指针变量名;

				int a , b;
				int * const p = &a; 
				p = &b ; //error 

常量指针:

是一个指向常量的地址。指针指向的对象是常量,

那么指针本身的指向是可以改变的,但是这个指针指向

内存空间中的内容是不能够改变。

最具有代表性例子,字符串

char * p = "abcde"; //"abcde" <=> &'a' 

定义方式:

const 类型 * 变量名;

or

类型 const * 变量名;

指针数组 与 数组指针

(1) 指针数组

指针数组是一个数组,只不过它里面的每一个元素都是指针罢了!

定义数组:

数组元素类型 数组名[元素个数];

“数组元素类型” : C语言中任意合法的类型都可以。

int * p[4]; //定义了一个指针数组,数组名为p,里面含有4个int*类型的指针。

(2) 数组指针

数组指针是一个指针,只不过这个指针是用来指向一个数组罢了!!

int (*p)[4] ; //定义了一个数组指针,指针变量名为p,用来指向一个含有4个int类型元素的数组的。 

int a[3][4];
int (*p)[4];
p = a; //&a[0]
*(*p + 1) // *(a[0]+1)==*(&a[0][1])==a[0][1]
*(*(p + 2)) // *(*(&a[2]))==*(&a[2][0])==a[2][0]
*(*(p+3) + 3)// *(*(&a[0]+3)+3)==*(*(&a[3])+3)==*(&a[3][0]+3)==a[3][3]

字符串与指针

字符串就是一串字符。在C语言中,没有字符串这个类型。

C语言字符串是通过 char *(字符指针)来实现。

C语言中的字符串,是用""引起来的一串字符来表示,并且字符串后面默认会加一个\0,\0(ASCII为0的那个字符)字符串结束的标志。

            "abc"  //字符串 
            "\n"   //字符串 
            ""     //字符串 => 空串 
            '\123' //字符
            '\n'   //字符 

注:

我们只需要保存字符串的首字符地址就可以了,从首字符地址开始找到第一个\0,前面的这些字符就是字符串里面的字符。

在C语言中的字符串(如: “ssssssabcd”)是保存在一个叫做 .rodata(只读数据)的内存区域,字符串代表是这个内存空间的首地址。

"ssssssabcd" => 表达式的值  => &'s'
			char *p="12345" ==&'1'
				int *p=&'1';	
				p+1=&'2';

字符数组:

			char s[5] = {'a', 'b', 'c', 'd', 'e'}; 
			//字符数组,与普通数组是一样的,保存在一个.data/栈空间 
			//数组区域是可读可写的 
			sizeof(s) == 5 
			strlen(s) >= 5 //没有'\0' 长度不确定
			char s[] = {"abcde"}; //自动生成'\0'
			<=> char s[] = {'a', 'b', 'c', 'd', 'e', '\0'}; 
			//s字符数组,与普通数组是一样的,保存在一个.data/栈空间 
			//数组区域是可读可写的
			sizeof(s) == 6	 
			strlen(s) == 5
			char s[] = {"abcde"};
			s[1] = 'B'; //OK 
			char ch = s[1]; //OK 
			*(s + 1) = 'B'; //OK 
			ch = *(s + 1); //OK 
			s = s + 1; //ERROR 
						//s是数组名,数组名当作指针,指针常量 
						//s的指向 是不能够改变的,但是s指向的内存空间
						//里面的内容是可变的
			printf("%s\n", s); //abcde   %s : char* 地址
			//把后面的那个地址当作是一个字符串的首地址,一个一个字符进行输出,直到遇到\0才会结束!			
					

函数指针

函数也有地址 ,那么咱们可以定义一个指针,去存放一个函数的地址,像这样的指针,称为函数指针。

函数指针如何定义

int *  abc(int a, float b)
			{
			}

描述函数abc的类型: int (int , float ) : 是一个返回值为int类型,带有一个Int类型和float类型的参数的函数类型

指向函数的返回值的类型 (*指针变量名) (指向函数的形参类型列表);

int (* p)(int, int) ; 

定义了一个指针变量p,p是一个函数指针,是用来指向一个返回值为int类型,并且带有两个int类型参数的函数的。

函数指针如何赋值

&函数名

or

函数名 : 在C语言中,函数名本身就可以代表函数的地址

通过函数指针去调用指向的函数,有如下两种方案:

p为函数的指针。

(1) (*p)(实参列表)

(2) p(实参列表)

int *p=abc//函数名
p(a,b);//调用函数

二级指针 与 多级指针

int a,b;

可以定义一个指针变量p1,来保存变量a的地址:

int *p1=&a;
b=*p1=*&a=a;//通过指针p1访问a变量

可以定义一个指针变量p2,来保存变量p1的地址:

int *p2=&p1
int b=**p2=*p1=a//通过指针p2访问a变量

p2保存的是一个一级指针p1的地址,所以说,

p2指向一个一级指针,p2就是一个二级指针

可以定义一个指针变量p3,来保存变量p2的地址:

int *p3=&p2;
int b=***p3=**p2=*p1=a;

p3保存的是一个二级指针p2的地址,所以说,

p3指向一个二级指针,p3就是一个三级指针

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

--结束END--

本文标题: C语言简析指针用途

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

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

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

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

下载Word文档
猜你喜欢
  • C语言简析指针用途
    目录对象的访问方式什么是指针指针变量与指针相关的运算符指针变量作为函数参数数组与指针多维数组与指针指针常量 和 常量指针指针数组 与 数组指针字符串与指针函数指针二级指针 与 多级指...
    99+
    2024-04-02
  • C语言浅析指针的使用
    目录指针等价形式转换函数指针主函数指针 指针是一个变量 (1) 作用:只能存储地址的值 (2) 大小:32位操作系统中占4字节;64位操作系统中占8字节 (3) 取地址:& ...
    99+
    2024-04-02
  • C语言中二级指针解析(指向指针的指针)
    目录二级指针(指向指针的指针)二级指针的定义与理解二级指针定义格式二级指针赋值实例二级指针(指向指针的指针) 指针可以指向一份普通类型的数据,例如 int、double、char 等...
    99+
    2024-04-02
  • C语言简明介绍指针的使用
    目录1. 指针类型2. 野指针3. 指针的运算3.1 指针+-整数3.2指针-指针3.3 指针的关系运算4. 指针数组1. 指针类型 指针以字节为单位; 指针类型决定了解引用时能访问...
    99+
    2024-04-02
  • C语言简明分析指针与引用的具体用法
    目录1、指针2、引用1、指针 在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元。为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根...
    99+
    2024-04-02
  • C语言指针使用实例分析
    今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来...
    99+
    2023-07-02
  • C语言 指针综合解析
    目录指针总结1.指针的本质1.1 指针的定义1.2 取地址操作符与取值操作符2.指针的使用场景2.1 指针的传递2.2 指针的偏移(指针的加减)2.3 指针与自增、自减运算符2.4 ...
    99+
    2024-04-02
  • C语言指针应用实例分析
    这篇文章主要讲解了“C语言指针应用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言指针应用实例分析”吧!1、指针是什么指针理解的2个要点:平时口语中说的指针,通常指的是指针变量,...
    99+
    2023-06-30
  • C语言指针详解之野指针
    目录指针是什么?怎么表示?什么是指针变量?指针类型又是什么?指针类型存在的意义野指针是什么?野指针产生的原因一、 指针未初始化二、 指针越界访问如何避免野指针(野狗)的出现呢?指针运...
    99+
    2024-04-02
  • C语言指针怎么用
    这篇文章主要为大家展示了“C语言指针怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言指针怎么用”这篇文章吧。一、字符指针在指针的类型中我们知道有一种指针类型为字符指针 char* 。思...
    99+
    2023-06-25
  • C语言基础野指针与空指针示例分析
    目录一:野指针野指针的成因1. 指针未初始化2. 指针越界访问3 .指针释放后未置空规避野指针1. 初始化指针 2. 避免指针越界 3 避免返回局部变量的地址 4. 开辟的指针释放后...
    99+
    2024-04-02
  • C语言智能指针之weak_ptr浅析
    目录前言使用环境测试过程现象分析总结前言 weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺...
    99+
    2024-04-02
  • C语言指针运算实例分析
    这篇文章主要介绍“C语言指针运算实例分析”,在日常操作中,相信很多人在C语言指针运算实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言指针运算实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-30
  • C语言指针详解
    目录前言:复杂类型说明一、细说指针1.指针的类型2.指针所指向的类型3.指针的值----或者叫指针所指向的内存区或地址4 指针本身所占据的内存区二、指针的算术运算三、运算符&...
    99+
    2024-04-02
  • C语言深入分析数组指针和指针数组的应用
    目录一、数组类型二、定义数据类型三、数组指针四、指针数组五、小结一、数组类型 C语言中的数组有自己特定的类型数组的类型由元素类型和数组大小共同决定 例:int array[5] 的类...
    99+
    2024-04-02
  • 详谈C语言指针
    #include<stdio.h> int main() { int a = 10; int b = 20; int* p = &a;//*定义指针变量...
    99+
    2024-04-02
  • C语言指针如何使用
    这篇“C语言指针如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言指针如何使用”文章吧。指针概述C语言中指针也可以...
    99+
    2023-06-30
  • C语言中指针怎么用
    这篇文章给大家分享的是有关C语言中指针怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.1:概述1.1.1:内存内存含义:储存器:用来存储程序和数据,辅助CPU进行运算处理的重要组成部分。内存:内部存储器,...
    99+
    2023-06-25
  • C语言指针用法总结
    1、先谈谈内存与地址 引例: 计算机的内存看成大街上的一排房屋,每个房屋都要有门牌号,这个就相当于计算机的内存地址,而房屋里面住的人、家具等等就相当于需要存放的各种各样的数据,所以要...
    99+
    2024-04-02
  • 解析Go语言和C语言指针的特性及应用
    Go语言和C语言是两种非常常见的编程语言,它们都支持指针的概念,但在使用方式和语法上有一些不同。本文将对Go语言和C语言的指针特性进行详细解析,并通过具体的代码示例来说明其应用。 一、...
    99+
    2024-03-07
    go指针应用 c指针特性 编程语言指针 go语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作