• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 简单总结C语言中各种类型的指针的概念

简单总结C语言中各种类型的指针的概念

作者:像风一样的自由 字体:[增加 减小] 来源:互联网 时间:2017-05-28

像风一样的自由 通过本文主要向大家介绍了c语言指针类型,c语言指针类型转换,c语言文件类型指针,c语言中指针的类型,c语言教程 指针的类型等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念。
 
常量指针:
首先它是一个指针,常量只是用来修饰指针的定语。其定义如下:

char const * cp; 
char a='a'; 
</div>

如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针。即指向常量的指针。

cp=&a; //正常语法 
*cp=a; //错误语法,因为其指向的值是一个常量 

</div>

 
指针常量:
首先它是一个常量,指针是用来修饰常量的,即常量的值为一个指针地址。

 
char * const cp; 
char a='a'; 
</div>

如何识别呢?根据右结合优先,先是const优先,所以这个cp变量是一个常量,然后是*修饰const,所以这是一个指针常量。

cp=&a; //错误语法,因为其地址为是一个常量
*cp=a; //正确,地址所指向的内容是一个普通字符
</div>

 
指针数组:
首先它是一个数组,指针是用来修饰数组内容的,表示什么样的数组 :即存放指针的数组

char *arr[3] = {"1","123","345"}; 
</div>

如何识别,因为[]的优先级大于*,所以先是定义为一个数组,而后由*来修饰这个数

printf("arr0%c\n",*arr[0]); 
printf("arr1%s\n",arr[1]); 
</div>

 
数组指针:
首先它是一个指针,数组是修饰指针的,即指向数组的指针。

char (*p)[3];  //申明时不能同时初始化 
char arr[3] = {'1','4','7'}; 
p=&arr; //指向数组的首地址,同时指针的类型是char * [3] 类型的,即加1操作后为sizeof(char [3])三个字节数 
</div>

如何识别:因为这次添加了一个显示优先,所以这次先是一个指针,而后[]修饰指针

printf("%c\n",(*p)[0]);  //先取arr的首地址,再根据这个地址取数组内容 
printf("%c\n",(*p)[1]); 
printf("%c\n",(*p)[2]); 
printf("%c\n",*((char*)p+0)); //先转换为char指针,再取值 
printf("%c\n",*((char*)p+1)); 
printf("%c\n",*((char*)p+2)); 
printf("%c\n",((char*)p)[0]); //先转换为char指针,再取数组的值,和第一个类似 
printf("%c\n",((char*)p)[1]);  
printf("%c\n",((char*)p)[2]);  

</div>

函数指针:
首先它是一个指针,函数是修饰指针的,即指向函数的指针。

char (*func)(void); //定义函数指针 
char test(void)  
{ 
return 'A'; 
} 
func = test;  //初始化赋值 
printf("test address: %p\n",test); 
printf("func address: %p\n",func); 
char ch = func();  //调用 
printf("%c\n", ch); 
</div>

如何识别,同数组指针一样,因()的优先级,所以这个定义首先是一个指针,而后才是对指针的描述,即一个指向函数的指针,其指向的函数也是规定的:即返回的是字符类型,不需要传入参数
 
 
指针函数:
首先它是一个函数,指针修饰函数的返回类型,即一个返回指针的函数
 

char *func(void); 
</div>

如何识别,因为没有扩弧,所以*的优先级没有右边的扩弧优先级高,所以先是规定了一个函数,*只是修饰返回值的

char *func(void) { 
  char *str = "test"; 
  return str; 
 } 
 void main() { 
  char *test = func();  
  printf("%s\n",test);  
} 
</div>

 
 
结构体指针:
当然其原先也是一个指针,只不过就是指向了结构体而已。故而为结构体指针。

 
指针结构体:
指针结构体,其实也没有必要有这个概念,无非就是带有指针作为子项的结构体。

 
指针类型转换:
指针类型转换是个有意思的东西,你可以把一个int型的指针转换为char类型,然后再把char类型的指针转换为int型;就像普通的字符和int型之间的转换一样。但指针转换后其值没有变,唯一变的东西就是指针的步长,即进行指针运算时的计算方式。当为char指针时其运算单位均以1个字节为1个运算单位,而当为int指针时通常都是以4个字节为1个运算单位。
 
指针算术:
根据上面的指针类型转换介绍可知,不同的指针类型进行算术运算时其计算方式时不相同的,其不同之处就在于其步长的字节数不同,而具体其步长为几个字节数是以其指针类型决定的,指向char的指针步长即为1。通常的指针运算有指针与数字的加减运算,相同类型的指针的减法运算,而且还要是指向同一个数组的,不然意义不大。同理推得不同类型的指针进行运算意义更不大,甚至会报错。
下面举一个指针算术的例子,交换两个变量值不利用额外变量
毕竟new关键字还是申请了额外的内存,虽然没有申请变量,换汤未换药

int *a,*b;   
a=new int(10);    //给指针赋值 
b=new int(20);    //a=0x00030828,b=0x00030840 
a=(int*)(b-a);    //a=0x00000006 
b=(int*)(b-int(a));  //b=0x00030828 
a=(int*)(b+int(a));  //a=0x00030840 

</div>

只是交换变量的话也可以:

int a = 4; 
int b = 5; 
 
*(((char*)&a)+1) = *((char*)&b); 
*((char*)&b)=*((char*)&a); 
*((char*)&a)=*(((char*)&a)+1); 
*(((char*)&a)+1)=0; 
</div>

 
指针参数:
指针参数就是指,指针作为函数的参数进行传递,因为C语言只支持单向传值,且返回值只能是一个值类型,所以想要从函数内返回多个内容或者与函数体有一个共同的数据操作区域,那这个时候就可以考虑通过传指针参数的方式了。传指针也是传值,只不过这时的值为指针指向的地址,也就是一个int整数。通过传递一个地址后就可以对一个共同的区域进行操作和数据共享了。
 
指针指针:
指针的指针就是指向指针的指针,同理还有指向指针指针的指针;不过一般人的思维能做二级、三级的指针的就很好了。这里主要是扩展一下指针与多维数组的关联关系。从个别到一般来分解多维数组的处理。这里个别肯定是用二维数组来举个例子,那就可以延伸到多维数组。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 整理C语言中各种类型指针的特性与用法
  • 简单总结C语言中各种类型的指针的概念
  • C语言指针的长度和类型深入分析
  • C语言的指针类型详细解析

相关文章

  • 2017-05-28C++编程中逗号运算符和条件运算符的使用方法讲解
  • 2017-05-28C++基础知识实例解析(一)
  • 2017-05-28简要对比C语言中的setgid()函数和setregid()函数
  • 2017-05-28c++ 连接两个字符串实现代码 实现类似strcat功能
  • 2017-05-28c语言实现一个简单日历
  • 2022-04-30通俗地理解什么是编程语言
  • 2017-05-28C语言计算代码执行所耗CPU时钟周期
  • 2017-05-28纯C语言:折半查找源码分享
  • 2017-05-28C语言WinSock学习笔记第1/2页
  • 2017-05-28C++实现简单的希尔排序Shell Sort实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中基类和派生类之间的转换实例教程
    • 深入分析父子线程、进程终止顺序不同产生的结果
    • string中c_str(),data(),copy(p,n)函数的用法总结
    • C语言程序中递归算法的使用实例教程
    • C++编程中删除运算符与相等运算符的使用解析
    • C++泛型算法的一些总结
    • C++多态的实现机制深入理解
    • 常用的STL查找算法
    • 关于"引用"的几点说明介绍
    • 浅谈Linux环境下并发编程中C语言fork()函数的使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有