强制类型转化(数组名以及数组名取地址)

代码:

void main()
{
	int a[4]  = {1,2,3,4};

	int *ptr0 = &a[0] + 1;
	int *ptr1 = (int *)(&a + 1);
	int *ptr2 = (int *)((int)a + 1);
	int *ptr3 = (int *)(a + 1);

	cout<<*ptr0<<" "<<ptr1[-1]<<" "<<*ptr2<<" "<<*ptr3<<" "<<endl;
}

解释:

&a[0]+1---->>指针加一:取决于指针的类型,a[0]的类型为int即整型

所以:&a[0]+1 = &a[0]+4,ptr0指向数组的第二个元素

&a+1   ---->>指针加一:取决于指针的类型,&a是指向数组的一个指针

大小为4*4=16个字节,&a+1 = a+16,所以ptr1指向4的后面的一个空间

int(a)+1--->>普通加法:先把a的地址强制类型转化为整型数再加一

(int *)((int)a + 1):把刚求出来的整型值强制转化为地址(int *)

即指向元素a[0]的第二个字节,因为指针是int型的,所以结果是

a[0]的后三个字节,以及a[1]的第一个字节

a+1    ---->>数组名加一:数组名(指针常量)类型:因为数组元素是:

int型,所以a也是int型指针,a+1 = a+4,所以指向下一个元素

看下面一段代码:

#include<iostream>
using namespace std;

int a[2] = {1,2};
int main()
{
	cout<<"a      = "<<a   <<endl;
	cout<<"&a     = "<<&a  <<endl;
	cout<<"a + 1  = "<<a+1 <<endl;
	cout<<"&a + 1 = "<<&a+1<<endl;
}

解释:

一般情况

<c和指针>p141:数组名的值是一个指针常量,也就是数组第一个元素的地址;

他的类型取决于数组元素的类型:如果元素类型为char则,数组名的类型就是

“指向char型的常量指针”

特殊情况

<c和指针>p142:当数组名作为sizeof操作符和单目操作符&的操作数时,数组名

并未当做指针常量表示,sizeof(数组名)=数组的长度,&数组名=是一个指向数组

的指针,(而不是一个指向指针常量的指针)

//&a------------->一个指向数组的指针

//a ------------->一个指向a[0]的指针

时间: 2024-11-07 15:13:09

强制类型转化(数组名以及数组名取地址)的相关文章

c++中一些强制类型转化

C语言中经常可以见到一些强制类型转化,主要是在变量名前加(类型).而在c++中与c语言也有一些差异,C++中主要有四种强制类型转化. static_cast它的主要转化是对于相关类型之间的转化 int main() { float a = 1.2; int b = static_cast<int>(a); cout << b << endl; getchar(); return 0; } 2.reinterpret_cast它的主要转化是对于不相关类型之间的转化 int

Delphi强制类型转化和类型约定

强制类型转换时一种技术,通过它能够使编译器把一种类型的变量当做另一种类型. 由于Pascal有定义新类型的功能,因此编译器在调用一个函数时候对形参和实参类型匹配的检查是非常严格的.因此为了能够通过编译器检查,经常需要把一个变量的类型转换为另一个变量的类型.例如:假定要把一个字符类型的值赋给一个byte类型的变量: var c: char; b: byte; begin c:= 'a'; b:= c; //编译器要提示错误 end. 在下面的代码中,强制类型转换把c转换成byte类型,事实上强制类

python输入输出的格式化,用户输入函数,强制类型转化

#coding=utf-8name=raw_input('name:') #raw_input 输入的默认是字符,input默认输入的是输入的格式python3.x中用input=raw_inputage=int(raw_input('age:'))#int()强制类型转换(intster)print type(age)#输出age的类型格式job=raw_input('job:')salary=raw_input('salary:')#''''''代表着多行注释,赋值给变量就是多行变量,最好不

数组名的地址,和数组名取地址的讨论

这个问题的发现是在以下的代码中发现的: #include<stdio.h> int main() {     int arr[2]={1,2};     printf("%p",arr);     printf("%p",&arr);     return 0; } 在运行之后我们发现的数组名本身的地址和数组名内部存储的地址是完全一样的,我们把数组名理解为一个const的指针(数组名只能作为右值,而不是左值),而&arr到底是什么? 我尝

Asp.net 面向接口可扩展框架之类型转化基础服务

新框架正在逐步完善,可喜可贺的是基础服务部分初具备模样了,给大家分享一下 由于基础服务涉及太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 说到类型转化必须要清楚.net的类型,类型都不清楚何来类型转化 1.Primitive类型 1.1 这个概念估计很多人都没听说过,Primitive不是一个新类型,而是.net类型中最基本的一种分类,是基元类型的意思       MS将类型分为三类:Primitive(基元类型).Complex(复

【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容

问题描述 引用型变量存储的是对象实例的地址值,如果直接打印变量,输出的应该是地址值. 数值型数组如int型数组:初始化后直接打印数组名,输出的是地址值. 但是:char类型数组无论是new还是直接赋值初始化,直接打印后显示的居然不是地址值,而是数组内容. 原因分析 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintStream对象,PrintStream有多个重载的println方法,其中一个就是public void println(char[] x): 直接打

C语言对数组名取地址

你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是对指针进行加减操作

C语言 对数组名取地址

作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 示例: int a[5] = {1,2,3,4,5}; int *p = (int *)(&a+1); printf("%d\n",*(p-1)); 这个输出会是多少呢? 咦?为什么第二行需要强制转化类型呢? 答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针.怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]. 行指针+1,就是

PHP数组关于数字键名的问题

以下是对PHP数组数字键名的几点总结: 键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况 在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型 数字键名长度大于19位时,将变成 0 键名正常长度时,字符串或数值类型一样 $i = 126545165; $arr['126545165'] = 'abc'; $arr[126545165] = 'uio'; var_dump($arr); echo '<br>'; var_dump(isse