下面就几种情况讨论指针。

一.指针和变量

变量是存储空间的别名,访问形式是直接访问。

指针访问内存地址是间接访问。

使用指针访问内存的场合:1.局部变量,参数传递    2.动态分配内存

指针本身也是一个变量,用来保存内存地址的变量,也有存储空间。使用他来访问存储空间,会浪费存储空间,并是访问速度变慢。

二.指针和数组

使用指针打印数组元素值demo如下

#include<stdio.h>

int main ()

{

int array[10]={1,2,3,4,5};

int *parray=array;

printf("%d\r\n",*paaray);

printf("%d\r\n",*paaray+1);

printf("%d\r\n",*paaray+2);

printf("%d\r\n",*paaray+3);

printf("%d\r\n",*paaray+4);

return 0;

}

打印结果:1 2 3 4 5

一般情况下,数组名=常量字符串,但在做sizeof和&(取地址)运算时不等于常量指针。

eg:

#inlcude<stdio.h>

int main()

{

int array[10]={1,2,3,4,5};

int  *paddrarray=&array;  // 数组的地址,和数组首元素地址相同

printf("%p\t%p\r\n",parray,paddrarray);打印结果相同

printf("%p\t%p\r\n",parray+1,*paddrarray+1);打印结果相同,都是int型指针+1

printf("%p\t%p\r\n",array,&array+1);打印结果不同,一个是数组首元素地址+1,一个是数组地址+1

//array+1----array+sizeof(*array)

//&array+1----array+sizeof(*&array+1)

return 0;

}

下面附一个很有意思的例子:

打印结果为:

在main.c中欺骗了编译器,指针当成数组使用,char数组中实际是“hello world”的内存地址

正确打印为:

结果为:

pstr是指针地址,转换成内存地址格式(unsigned int*)格式,(*(unsigned int *)pstr))是HELLO WORLD 的地址,整个即为值HELLO WORLD.

数组作为函数参数传递时会被降级为指针,下面附几个例子做对比

三.指针运算(偏移运算)

连续空间的运算才是有意义的,规则:p+sizeof(*p)

#include<stdio.h>

int main()

{

int array[10]={1,2,3,4,5};

char *parray=array;

printf("%p\t%p\r\n",parray+1,array+1);//parry+sizeof(*parray)  (1Byte);

//array+sizeof(*array) (4Byte);

return 0;

}

而对于堆上的指针运算是没有意义的,是未定义的结果。

eg:int *p1=(int*)(malloc)(sizeof(int));

int *p2=(int*)(malloc)(sizeof(int));

p2-p1;

浅谈C语言指针的更多相关文章

  1. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  2. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  3. 浅谈Java语言环境搭建-JDK8

    title: 浅谈Java语言环境搭建-JDK8 blog: CSDN data: Java学习路线及视频 1.What's the JDK,JRE JDK(Java Development Kit ...

  4. 浅谈c语言结构体

    对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...

  5. 浅谈C语言中断处理机制

    一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...

  6. 浅谈c语言的指针

    对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...

  7. 浅谈C语言 extern 指针与数组

    /* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...

  8. 浅谈 C 语言中模块化设计的范式

    今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...

  9. 浅谈C语言变量声明的解析

    C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...

随机推荐

  1. 使用HttpClient进行Get方式通信

    下载apache包 http://hc.apache.org/downloads.cgi 比较eclipse自带api,简单,易上手 实例: package zw1; import java.io.I ...

  2. 简单c语言子集词法分析器

    概述 词法分析是编译的第一个环节,其输入是高级语言程序,输出是单词串.词法分析器的主要任务是将高级语言程序作为字符串输入,然后依据词法规则将字符串组合成单词,并输出单词串. 为了方便之后的编译环节,通 ...

  3. 《分布式Java应用之基础与实践》读书笔记一

    分布式Java应用的体系结构知识简单分为: 网络通信:包括协议和IO 消息方式的系统间通信:包括基于Java包.基于开源框架.性能角度 远程调用方式的系统间通信:包括基于Java包.基于开源框架.性能 ...

  4. JQuery插件之Animate.css和 jquery-aniview

    Animate.css 一款强大的预设css3动画库 简介 animate.css 是一个来自国外的 CSS3 动画库,它预设了抖动(shake).闪烁(flash).弹跳(bounce).翻转(fl ...

  5. Python、PyCharm的安装及使用方法(Mac版)

    上周跟朋友喝咖啡时聊起我想学Python,她恰好也有这个打算,顺便推荐了一本书<编程小白的第1本Python入门书>,我推送到Kindle后,随手翻看了下,用语平实,简洁易懂. 之前在R语 ...

  6. 通过bootloader向内核传输启动参数

    作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Linux提供了一种通过bootloader向其传输启动参数的功能,内核开发者 ...

  7. Lambda表达式和Lambda表达式树

    LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态. 为了富有效率的使用数据库和其他查询引擎,我们需要一种不同的方式表示管道中的各个操作.即把代码当作可在编程中进行检查的数据. Lambd ...

  8. Ruby中有意思的块

    块:是在调用方法时,能与参数一起传递的多个处理的集合 简单点说,跟在方法执行后面的do |变量| end就是一个块,这个块会被传入方法中去执行! 这个非常厉害,非常有意思! 在ruby中,如果需要便利 ...

  9. Github--账号重新申请与配置

    2017-04-24 最近洗心革面痛下决心要好好再深入学习一番前端,正好加入了一个外包团队接了份单子,外包项目正在如火如荼地进行着,自己也打算趁这个机会来好好学习总结一番. 但是俗话说得好," ...

  10. 在Mvc中进行异步请求是出现(没有为该对象定义无参数的构造函数)

    解决办法就是给相应的类添加无参数的构造函数: