2 ni de yang zi ni_de_yang_zi 于 2016.04.01 11:32 提问

关于指针强转的步长问题

#include
#include

void arr_test(char arr)
{
(
((char *)arr+1) ++;
}

int main()
{
int i;
int arr[4] = {1,2,3,4};

arr_test(arr);

for(i = 0; i < 4; i++)
                printf("%d \n",arr[i]);
exit(0);

}

最后结果为什么是:257 2 3 4。求探讨 告知!!

2个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.01 12:09
已采纳

首先int占4个字节,我们现在大部分的PC都是小端模式(低位字节低地址)
所以arr[0]为1的话,在内存中的存储是0000 0001 0000 0000 0000 0000 0000 0000
用char *指针去指向arr的话,(char *)arr+1代表的就是arr[0]第二个字节所在,即0000 0000
然后++变成了0000 0001
所以arr[0]所在内存变成了0000 0001 0000 0001 0000 0000 0000 0000,即257
arr[1],arr[2],arr[3]都没变
注:楼主这个代码在我的VS里都编译不过去。。。

ni_de_yang_zi
ni_de_yang_zi 真心谢谢大神的讲解!!懂了。由于手误上面的函数是:参数是char *arr,其实现是(*((char *)arr+1))++;
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.04.01 11:42

void指针强转结构体指针问题
指针强转注意的问题
转:C语言指针问题快速解惑
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
二维数组、指针、步长
#include #include #define PRINT(value) printf("%s:%d\n",#value,value); void main() { int a[3][5]; PRINT(a);// 8517344 PRINT(*a);// 8517344 PRINT(a + 1);// 8517364 PRINT(*a + 1);// 8
C++学习——父类指针和子类指针的步长问题
C++中父类指针可以指向子类对象,很多时候这的确提供了方便之门。担当遇到对象数组时,就要慎重考虑了。指针运算是按指针类型的长度进行计算的,对于子类对象数组,当使用父类指针指向子类对象时,指针的步长依然是父类对象所占的长度,指针移动后,所指的位置不一定就是下一个子类对象数组元素的起始地址。#include <iostream> using namespace std;class Parent {
指针步长
#define _CRT_SECURE_NO_WARNINGS #include #include #include int main(void) { //1、指针步长, +1后的变化 //2、指针步长由数据类型决定,由指针所指向的内存决定,不是有赋值内容决定 //3、类型一样,步长肯定一样,步长一样,类型不一定一样 int a = 0; printf("%d, %d\n", a,
指针类型、步长、内存大小
指针类型、步长、内存大小(1)指针的类型分清常量指针和指针常量(2)指针的步长(见第一个测试)和基本类型相同。如:char *p;//步长 = 1byteint *p;// 步长 = 4byte(3)指针的内存大小(见测试及说明)(4)测试平台:Windows   VC6.0(32位)平台:Linux(Ubuntu14.04)  gcc 4.8.5(默认64位)说明:指针变量是特殊的变量,要求其内...
万能指针 和 指针大小与指针步长的区别
//void,无返回值, 无参数函数修饰 //void a; //err, void是无类型,无法确定真正的类型 void * p; //ok, 指针的大小是固定,和编译器有关 int a = 10; p = &a; //间接操作内存:1)首地址 2)长度(步长) printf("%d\n", *(int *)p); char ch = 'a'; p = &ch; printf
内存地址对齐与指针步长的考察
在32位系统中,下面代码的打印结果是4,120  void main() { #pragma pack(2) typedef struct { unsigned long index; char name[9]; char *attr[4]; }tSA,*ptSA; #pragma pack() int z=sizeof(tSA); tSA sa[5]; ptSA ps
父类指针和子类指针的步长问题
//#include "stdafx.h" #include using namespace std; class Animal { public: Animal(int _a) : a(_a) {} virtual void test() { cout "父类test函数调用" << endl; } virtual ~Animal() { cout "~Animal
父类指针的步长和子类指针的步长不一样
传智扫地僧课程学习笔记。
指针强制转换问题
(强制):如果指针所指向的类型带有const  或volatile               限定符,那么移除限定符 的强制转换是不允许的。  (11.5 A cast shall not be performed that removes any const or volatile qualification from the type  addressed by a pointer. )     任何通过强制转换移除类型限定符的企图都是对类型限定符规则的违背。注意,这里所 指的限定符与任何可以应用在指
C++中父子类中指针的步长问题
#include using namespace std; class Parent { public: Parent(int a=0) { this->a = a; } virtual void print() { cout << "我是爹" << endl; } private: int a; }; class Child:public Parent { publ