问题一:
#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指针陷阱的更多相关文章
-
必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱
必须要注意的 C++ 动态内存资源管理(五)——智能指针陷阱 十三.小心使用智能指针. 在前面几节已经很详细了介绍了智能指针适用方式.看起来,似乎智能指针很强大,能够很方便很安全的管理 ...
-
[转载] C++ typedef 用法详解
typedef的语法描述 在现实生活中,信息的概念可能是长度,数量和面积等.在C语言中,信息被抽象为int.float和 double等基本数据类型.从基本数据类型名称上,不能够看出其所代表的物理属性 ...
-
Go学习笔记01-语言
1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...
-
问题:这个新申请的内存为什么不能free掉?(已解决)
一.问题描述 先上代码, /*** 省略 ***/ uChar *base64 = NULL; /*** 省略 ***/ base64 = (一段内存) /*** 省略 ***/ base64 = s ...
-
[C++ Primer] : 第12章: 动态内存
动态内存与只能指针 静态内存用来保存局部static对象, 类static数据成员以及定义在任何函数之外的变量. 栈内存用来保存定义在函数内的非static对象. 分配在静态或栈内存中的对象由编译器自 ...
-
typedef用法和与define的区别
typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍typed ...
-
#define与typedef
#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...
-
C++基础之动态内存
C++支持动态分配对象,它的生命周期与它们在哪里创建无关,只有当显示的被释放时,这些对象才会被销毁.分配在静态或栈内存中的对象由编译器自动创建和销毁. new在动态内存中为对象分配空间并返回一个指向该 ...
-
typedef &; #defiine &; struct
#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...
随机推荐
-
Android异步回调中的UI同步性问题
Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastRe ...
-
idea的修改文件变颜色
直接用IntelliJ IDEA 拉SVN 工程 时,如下图所示都不勾选可以成功拉取.
-
spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spring ...
-
cocos2dc-x解决中文乱码
中文乱码: 方法一: 选中有中文的那个cpp,点文件另存为,在保存这里竟然有个小箭头 点之,再点编码保存 再选这个编码 这个cpp就UTF-8化了,然后中文就正常了. 但是发现:但字符串字符数为奇数时 ...
-
CSS两端对齐
前面的话 两端对齐在导航条Tab的制作中非常常用.本文将详细介绍CSS两端对齐的3种实现方式 flex 弹性盒模型flex作为强大的弹性布局方式,可以hold住大部分的布局效果,当然也包括两端 ...
-
Entity Framework 乐观并发处理
Entity Framework 乐观并发处理 有一段时间没有更新博客了,今天终于有一些时间,和大家讨论一个Entity Framework 乐观并发处理的问题.首先需要说明的是,这里提到的 “并发” ...
-
jQuery-少见获取元素的方式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
-
python的生成器与迭代器和可迭代对象
来简单的说下python中的生成器和可迭代对象以及迭代器的问题.只是简单地记录一下并不涉及太深入的内容. 首先来说一下什么是生成器,先看下面的代码: #_*_ coding:utf-8 _*_ res ...
-
解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file
原文地址:http://blog.csdn.net/yjk13703623757/article/details/53217377 一.问题 运行hydra时,提示错误: hydra : error ...
-
Scaleform Gfx的Demo
转载:http://www.xuebuyuan.com/2167614.html 新建一个Demo工程时,编译之前有一些VS的配置是必须的,在Debug和Release下,工程必须包括: $(GFXS ...