浅谈C语言指针
下面就几种情况讨论指针。
一.指针和变量
变量是存储空间的别名,访问形式是直接访问。
指针访问内存地址是间接访问。
使用指针访问内存的场合: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语言指针的更多相关文章
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 转 浅谈C++中指针和引用的区别
浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...
- 浅谈Java语言环境搭建-JDK8
title: 浅谈Java语言环境搭建-JDK8 blog: CSDN data: Java学习路线及视频 1.What's the JDK,JRE JDK(Java Development Kit ...
- 浅谈c语言结构体
对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了.这造成很多学生对结构体的不熟悉.这里我就浅谈一下我对结构体的认识. 结构体,就是我们自己定义出一种新的类型,定义好之后, ...
- 浅谈C语言中断处理机制
一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...
- 浅谈c语言的指针
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
- 浅谈C语言 extern 指针与数组
/* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...
- 浅谈 C 语言中模块化设计的范式
今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...
- 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...
随机推荐
- 利用_winreg模块在注册表中分析无线访问热点
_winreg.OpenKey(key, sub_key, res, sam) key是一个已经打开的键,或者是HKEY_CLASSES_ROOT.HKEY_CURRENT_USER.HKEY ...
- JavaScript 函数的定义-调用、注意事项
函数定义 函数语句定义 function(a,b){ return a+b; } 表达式定义 var add = function(a,b){return a+b}; //函数表达式可以包含名称,这在 ...
- Caffe学习系列(四)之--训练自己的模型
前言: 本文章记录了我将自己的数据集处理并训练的流程,帮助一些刚入门的学习者,也记录自己的成长,万事起于忽微,量变引起质变. 正文: 一.流程 1)准备数据集 2)数据转换为lmdb格式 3)计算 ...
- python代码零散知识点
1.用python读入csv文件 green_taxi1=pd.DataFrame(pd.read_csv('../../../../MatlabCode/data/green/green_tripd ...
- 深入tornado中的ioLoop
本文所剖析的tornado源码版本为4.4.2 ioloop就是对I/O多路复用的封装,它实现了一个单例,将这个单例保存在IOLoop._instance中 ioloop实现了Reactor模型,将所 ...
- MAC系统操作指令汇总
OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- Java Web实现IOC控制反转之依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...
- 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼
https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html #include< ...
- Spring Cloud构建微服务架构(一)服务注册与发现
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...