//V推论①:指针变量的步长只与‘指针变量的值’的类型有关(指针的值的类型 == 指针指向数据的类型)

//指针类型跟指针的值有关,指针是占据4个字节大小的内存空间,但是指针的类型却是各不相同的
//指针的类型决定了指针指向的内存空间从哪个位置开始,从哪个位置结束 //普通变量名是一段内存空间的标识,普通变量名代表的是一段内存空间,
//对于复杂变量(例如指针):要知道某个指针的步长,必须确定指针的类型
//指针的值永远是一个十六进制数字,但是这个十六进制数字指向的内存空间却是不相同的 //int a[5]; char *arr[4]={"aa","ss","dd","ee"};对于这2个一维数组而言
//a是一个指针,a指针的值是a[0]这个int型变量的地址,所以a的类型是int *;
//arr是一个指针,arr指针的值是arr[0]这个char *型变量的地址,所以arr的类型是char **
//有人会想a的类型是int *,那么a的步长应该是sizeof(int *) 是4;其实不对,a的步长应该是a指向的内存空间的大小
//a指向的内存空间是int型的变量a[0],a[0]的大小是4个字节,因此a的步长是sizeof(int) 是4 虽然都是4 但是意义不一样
//再来讨论arr,由以上推论可得,arr的步长应该是arr指向内存空间的大小,arr指向内存空间是一个字符串的指针,
//字符串的指针的大小是 sizeof(char *) = 4 个字节,所以arr的步长是4个字节 //举例int a[5]={0},讨论a和&a的步长
//a指向的是一个int型变量(上面已经详述),a的步长是sizeof(int) = 4;
//&a这指针指向的是一个int型的一维数组,这个int型的一维数组的大小是sizeof(int)*5 = 20;
//所以&a的步长是20 //V推论②:多级指针是人为为‘指针本身’做的一种区分 //二级指针是指针本身类型的一种人为自定类别,但通常意义上指针的类型没有任何关系
//一级指针与二级指针的区别在于,一级指针的值是某种类型的数据的地址,而二级指针的值是一个指针的地址
//指针的步长只跟指针的类型有关系,跟指针是几级指针没关系 #include<stdio.h>
#include<stdlib.h> void main(){
int a[] = { , , , , };
printf("%x\n", &a); // 打印 76fc54
printf("%x\n", &a + ); // 打印 76fc68 得出结论:&a的步长是20(特别提醒:这是十六进制)
printf("\n-----------------\n");
char *myarr[] = {"aaaaa","bb","c","dede"};
printf("%x\n", myarr); // 打印 81fe88
printf("%x\n", myarr + ); // 打印 81fe8c 得出结论:myarr的步长是4
system("pause");
}

C语言 详解多级指针与指针类型的关系的更多相关文章

  1. 大牛针对零基础入门c语言详解指针(超详细)

    C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...

  2. 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)

    一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...

  3. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

  4. 详解C++11智能指针

    前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用. C++11智能指针介 ...

  5. Java Web----EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  6. 详解C/C++函数指针声明 ( *( void(*)())0)();

     ( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...

  7. 详解C/C++函数指针声明

    要理解一个C程序,仅仅理解组成该程序的符号是不够的.程序员还必须理解这些符号是如何组合成声明.表达式.语句和程序的. 我们先来看看下面的一个语句: 1 ( *( void(*)())0)(); 这是当 ...

  8. 拓扑排序(一)之 C语言详解

    本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...

  9. 邻接表有向图(一)之 C语言详解

    本章介绍邻接表有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现 ...

随机推荐

  1. AFNetworking使用方法

    官网下载2.5版本:http://afnetworking.com/ 此文章是基于AFNetworking2.5版本的,需要看AFNetworking2.0版本的请看上一篇文章:AFNetworkin ...

  2. 将tomcat源码导入eclipse

    前言: 写完了socket小应用的原始版本,中间还有好多预想的功能没有实现,在写的过程中也发现了很多问题.因为前面有粗略的看过tomcat实现原理解析,知道tomcat其实也是纯java写的web服务 ...

  3. img 在层内 居中显示

    div{width:250px;height:150px;background:#000;position:relative;} img{;;;;margin: auto;} <div>& ...

  4. PAT 01-2

    #include<stdio.h> #include<stdlib.h> int main() { int k; int *data; int i; int ThisSum, ...

  5. HTML页面定时跳转方法

    1)html的实现 <head> <meta http-equiv="refresh" content="5;url=hello.html"& ...

  6. apt-get报错could not get lock /var/lib/dpkg/lock -open等

    用apt-get命令安装一些软件包时,总报错:E:could not get lock /var/lib/dpkg/lock -open等 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁 ...

  7. Effetive Java 22 Favor static member classes over nonstatic

    Nested class types Usage and remark Advantage Disadvantage static member classes Use for public help ...

  8. 了解linux内存管理机制(转)

    今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...

  9. JPA一对一关联

    这里我们仍然是使用annotation对实体进行配置.使用person与idcard模拟一对一的关联关系,一个人只能有一个ID号,同样一个ID号只能对应一个人,人与ID号是一对一的关联关系.Perso ...

  10. 设计模式C#实现(五)——抽象工厂模式

    抽象工厂模式 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML类图: 场景:抽象村商店想销售Pizza和Hamburg等多种商品,而在美国店和中国店要出售本土化的口味 ...