C指针陷阱

时间:2022-09-02 13:16:51

问题一:

#include <stdio.h>
int main(int argc, char *argv[])
{
int a[]={
,,,,
};
int *p =(int *)(&a+);
printf("%d,%d\n",*(a+),*(p-));
return ;
}

答案结果:2,5

解析:a 和&a的地址一样,但是意思不一样,a是数组的首地址,也就是a[0]的地址;

   &a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],而&a+1是下一个对象的地址,即a[5]。

所以:p实际上是a[5]的地址,但是p本身是指向int类型数据的指针,所以p-1只会减去sizeof(int*)。

注意:p=&a这样写法在ANSI C中是非法的,因为&a是一个指向数组的指针,而p是一个指向整形变量的指针,他们类型不匹配

问题二:

二维数组那点事:二维数组在内存中占据连续的空间,在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储,因此我们可以根据行号和列好

        来计算出相对于数组首地址的偏移量,从而找到对应的元组,比如:arr[row*columns+column]

问题三:

1, 以指针类型出现:

C语言中,指针类型值的本质为地址。

C语言规定,不同类型的指针,不可以做相减操作,只有同类才可以进行减操作。比如同样是char*,或者同样是int*等。注意int *和int**,即一维指针和二维指针属于不同类型。

同类型相减的计算原则为

T *a, *b;

a-b=(a与b值的算术差值)/sizeof(T);

2, 以整型变量形式。比如将地址值转为long型存储,这时地址本身已经转换成了一个整型变量,所以相减结果就是值的算术差。

3,两个Int型变量的地址之差就是这两个地址中间可以有多少个int型变量。(这是因为C语言可以根据变量的类型来决定地址增加的实际空间。比如你定义一个int指针int*p,

p=p+1时,其实在内存地址中实际加4,因为int在C中4个字节。)

C指针陷阱的更多相关文章

  1. 必须要注意的 C&plus;&plus; 动态内存资源管理&lpar;五&rpar;——智能指针陷阱

    必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱 十三.小心使用智能指针.         在前面几节已经很详细了介绍了智能指针适用方式.看起来,似乎智能指针很强大,能够很方便很安全的管理 ...

  2. &lbrack;转载&rsqb; C&plus;&plus; typedef 用法详解

    typedef的语法描述 在现实生活中,信息的概念可能是长度,数量和面积等.在C语言中,信息被抽象为int.float和 double等基本数据类型.从基本数据类型名称上,不能够看出其所代表的物理属性 ...

  3. Go学习笔记01-语言

    1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...

  4. 问题:这个新申请的内存为什么不能free掉?(已解决)

    一.问题描述 先上代码, /*** 省略 ***/ uChar *base64 = NULL; /*** 省略 ***/ base64 = (一段内存) /*** 省略 ***/ base64 = s ...

  5. &lbrack;C&plus;&plus; Primer&rsqb; &colon; 第12章&colon; 动态内存

    动态内存与只能指针 静态内存用来保存局部static对象, 类static数据成员以及定义在任何函数之外的变量. 栈内存用来保存定义在函数内的非static对象. 分配在静态或栈内存中的对象由编译器自 ...

  6. typedef用法和与define的区别

    typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍typed ...

  7. &num;define与typedef

    #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...

  8. C&plus;&plus;基础之动态内存

    C++支持动态分配对象,它的生命周期与它们在哪里创建无关,只有当显示的被释放时,这些对象才会被销毁.分配在静态或栈内存中的对象由编译器自动创建和销毁. new在动态内存中为对象分配空间并返回一个指向该 ...

  9. typedef &amp&semi; &num;defiine &amp&semi; struct

    #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...

随机推荐

  1. Android异步回调中的UI同步性问题

    Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...

  2. idea的修改文件变颜色

    直接用IntelliJ IDEA 拉SVN 工程 时,如下图所示都不勾选可以成功拉取.

  3. spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

    主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spring ...

  4. cocos2dc-x解决中文乱码

    中文乱码: 方法一: 选中有中文的那个cpp,点文件另存为,在保存这里竟然有个小箭头 点之,再点编码保存 再选这个编码 这个cpp就UTF-8化了,然后中文就正常了. 但是发现:但字符串字符数为奇数时 ...

  5. CSS两端对齐

    前面的话   两端对齐在导航条Tab的制作中非常常用.本文将详细介绍CSS两端对齐的3种实现方式 flex   弹性盒模型flex作为强大的弹性布局方式,可以hold住大部分的布局效果,当然也包括两端 ...

  6. Entity Framework 乐观并发处理

    Entity Framework 乐观并发处理 有一段时间没有更新博客了,今天终于有一些时间,和大家讨论一个Entity Framework 乐观并发处理的问题.首先需要说明的是,这里提到的 “并发” ...

  7. jQuery-少见获取元素的方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. python的生成器与迭代器和可迭代对象

    来简单的说下python中的生成器和可迭代对象以及迭代器的问题.只是简单地记录一下并不涉及太深入的内容. 首先来说一下什么是生成器,先看下面的代码: #_*_ coding:utf-8 _*_ res ...

  9. 解决error while loading shared libraries&colon; libXXX&period;so&period;X&colon; cannot open shared object file&colon; No such file

    原文地址:http://blog.csdn.net/yjk13703623757/article/details/53217377 一.问题 运行hydra时,提示错误: hydra : error ...

  10. Scaleform Gfx的Demo

    转载:http://www.xuebuyuan.com/2167614.html 新建一个Demo工程时,编译之前有一些VS的配置是必须的,在Debug和Release下,工程必须包括: $(GFXS ...