C语言指针的一些用法
指针是C语言的灵魂,精华之所在。指针强大而危险,用得好是一大利器,用得不好是一大
潜在危害。正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装
程度高的语言,越是没有指针的"存在"。比如JAVA,Python,就是把指针隐藏去了,不让用户接触,但很多功能
实质上还是用到指针的,只不过是封装好了,对用户隐藏。
如果指针学得好,在编程时可谓如虎添翼,用起招式也会游刃有余。
很多人觉得指针很难,其实不然,只要理解了指针的实质,多见,多练,也就是1+1=2的事。
指针的实质也很简单:在C语言中,指针是一种数据类型,用来存放各种类型的地址,通过地址可以找到该地址
单元的值,故称指针。简单而言,指针就是存放地址的。
指针强大的原因:程序要运行就必须加载到内存中去,因此程序的要运行的指令和所要
用到的数据都可以通过内存地址也就是指针获取到,有了指针你就可以掌控程序运行的流程和所用到的数据
然后可以为所欲为了,当然指针所能访问的一般而言都是合法的地址,至于如何访问不合法的地址,那就是另外的话题。
现在来看看指针的一些用法。
在C语言中,任何类型的指针的大小是4个字节,因为存放的都是地址。
1.
int *p;//定义了一个整型指针,可以存放整型数据的地址
int a=3;
p=&a;(p就了存放a的地址,也就是说p指向了a,*p就等于3)
2.
char*p="abcdef";//字符指针,p存放的是第一个字符(a)的地址,*p==a;
3.
int a1[10];//整型数组,a1是一个数组,存放整型(int)数据
int *p1=a1;//数组指针,p1是一个指针,存放整型数据的地址
int *a2[10];//指针数组,a2是一个数组,存放的是整型指针(int*)数据
int (*p2)[10];//数组指针,p2是一个指针,存放的是存放10个整型数据的数组的地址
4.
void fun(int,int)
{
}
void(*p1)(int,int);//函数指针,p1是一个指针,存放的是一个返回值为void,参数为两个int的函数的地址
p1=fun;//函数名即为函数的地址.
p1();
常见用法:typedef void(*pointer)(int,int);//pointer为自定义的类型,这种类型表示可以定义返回值为void,参数为两个int型的函数的指针
pointer p2;//p2是一个函数指针
p2=fun;
p2();
5.
void(*a[10])(int);//指针函数,a是一个数组,因为'[' 的优先级比'*'大,a先和‘[’结合,存放的数据是返回值为void,参数为一个int的函数指针,
6.
void(*(*p)[10])();//数组指针,p是一个指针,指向(存放10个返回值为void,没有参数的函数指针数据的)数组的地址
7.
二级指针:表示指针存放的数据本身又是一个指针。
char **p;//二级指针
char*str[2]={"abc","defg"];//字符串数组
p=str;//p是一个二级指针存放数组的地址,*p也是一个指针,存放的是第一个字符串的首字符的地址,**p就是字符'h'
8.
指针可以进行加减运算
int a[10];
假设
a[0]的地址: 1000(十进制)
a[1]的地址: 1004//因为int在C语言中占4个字节
a[2]的地址: 1008
int*p=a; //p存放的就是a[0]的地址1000,因为数组名就是数组第一个元素的地址
p++; //此时p不是加1变成1001,此时p应该为1004,指针的加减是按数据类型所占的字节数进行加减的
//因为int占4个字节,所以p++为1004指向下一个元素。也就是a[1]
9.
指针还有很多用法,有些起来很复杂,但是本质都一样,至于如何把指针的强大之处用起来,就要靠各位
在写程序时按需发挥了。
还是那句话,想熟悉一样东西,要多见,多练,多想。
C语言指针的一些用法的更多相关文章
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- 2-Linux C语言指针与内存-学习笔记
Linux C语言指针与内存 前面我们对于: c语言的基本用法 makeFile文件的使用 main函数的详解 标准输入输出流以及错误流管道 工具与原理 指针与内存都是c语言中的要点与难点 指针 数组 ...
- C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指 ...
- C 语言指针 5 分钟教程
指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里“引用”表示计算机内存地址.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具 ...
- 关于C语言指针的一些新认识(1)
Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...
- C语言指针专题——序
看到好多的C语言初学者学到指针时,都觉得指针怎么那么难啊!我也想起了我当时学习指针时遇到的困难,确实很难!到底是教程写的不好呢,还是老师教的不好呢?我觉得都有. 网上搜索指针讲解的资料很多,我也看了不 ...
- 深入理解C语言 - 指针使用的常见错误
在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...
- 深入理解C语言 - 指针详解
一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...
随机推荐
- Vuejs模板绑定
一.Vue实例 ①el:指定被Vue管理的模板入口,网页中的DOM节点,但是不能使用body和html,必须是一个普通的HTML标签节点,一般是div ②data:数据驱动视图的数据,在data中初始 ...
- OpenFOAM——设置非均匀边界方法总结
在使用OpenFOAM求解的时候我们经常需要设置非均匀的边界,比如我们在计算层流的时候,很多时候需要入口为充分发展的入口边界,下面我们就以入口处为充分发展的层流速度分布为总结OpenFOAM当中设定不 ...
- C语言之“字符”与“字符串”之间的区别解析
在C语言中,“字符”与“字符串”之间,是有区别的.这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别. 首先,一个很明显的区别是: “字符”,使用单引号作为定界符,而“字符 ...
- 《京东上千页面搭建基石——CMS前后端分离演进史》阅读笔记
一.背景 CMS即内容管理系统,目的是用于快速进行网站建设或者网页开发. 对于京东网站部门来说,CMS核心目的是用来快速开发和上线各种页面,诸如各种垂直频道页. 二.CMS核心目的 进行数据和模板的统 ...
- ubuntu16.04 用devstack部署安装OpenStack ocata
原文链接 之所以再重复一下,是因为踩坑的过程,希望能帮助有需要的人. 介绍: 宿主机win10,在vmware下创建两台ubuntu16.04虚拟机,一台作为控制节点,一台作为计算节点, ...
- bind named.conf 的理解
[root@46 /]#yum -y install bind bind-chroot bind-libs bind-utils caching-nameserver目录说明/var/named/ch ...
- Three.js 快速上手以及在 React 中运用[转]
https://juejin.im/post/5ca22692f265da30a53d6656 github 的地址 欢迎 star! 之前项目中用到了 3D 模型演示的问题,整理了一下之前学习总结以 ...
- UnityVR案例 - VR僵尸大战(HTC VIVE)
使用HTCvive设备开发的一款射击类游戏(Unity5.6.3),玩家在游戏中使用手枪.手榴弹或者技能杀死僵尸. 亮点功能:手势识别,语音唤醒(关键词识别) 手势识别:玩家使用手柄在游戏中绘制事先录 ...
- JPA连接PG数据库时间类型查询报错的修改
PG数据库中的时间格式规范: https://blog.csdn.net/sky_limitless/article/details/79527665 to_data 转换为 普通的时间格式 to_t ...
- arris1750 pandorabox安装bandwidthd之后带宽监控(nlbwmon)报资源不足
nlbwmon 报错资源不足不能看的原因很可能是内存不足导致,因为重启进程会概率可用一下,且删除老的数据后又好用了. 可能与设置的最大数据库条数有关,条数过大导致申请内存大,改成默认的10000. 可 ...