c语言-C语言指针相关问题,不能理解输出结果

问题描述

C语言指针相关问题,不能理解输出结果
 #include<stdio.h>

typedef unsigned char * char_point;

char_point int_cp(int i)
{
    printf("i: %dn", i);
    printf("&i: %pn", &i);
    printf("(c_p)&i: %pn", (char_point) &i);
    char_point cp = (char_point) &i;
    return cp;
}

char_point float_cp(float f)
{
    printf("f: %fn", f);
    printf("&f: %pn", &f);
    printf("(c_p)&f: %pn", (char_point) &f);
    char_point cp = (char_point) &f;
    return cp;
}

void endian(char_point cp, int size)
{
    for (int i=0; i<size; i++)
    {
        printf("0x%xn", cp[i]);
    }

}

int main()
{
    int i = 0x21893678;
    float f = 913.45678f;   

    endian(int_cp(i), sizeof(i));
        //endian((char_point) &i,  sizeof(i));
    printf("== == == ===  =   ==== === = == = == n");
        //endian((char_point) &f,  sizeof(f));
    endian(float_cp(f), sizeof(f));
}

期望的输出是和注释代码的输出一致

输出结果:

注释的输出:

解决方案

看一下这个,有点帮助的 http://blog.csdn.net/liuhuiyi/article/details/7526889

解决方案二:

我把你的代码在我的机子上跑了一遍,
i: 562640504
&i: 0033FCF8
(c_p)&i: 0033FCF8
0xf8
0xfc
0x33
0x0
== == == === = ==== === = == = ==
f: 913.456787
&f: 0033FCF8
(c_p)&f: 0033FCF8
0xf8
0xfc
0x33
0x0
不知道你的结果怎么跑出来的

解决方案三:

第一行 i: 是0x21893678的十进制的值
第二行 &i:变量i所在的地址
第三行 (c_p)&i: 整型 i 强转为 char型 ,但是仍指向i的地址,即地址没变
在C语言中 Char型占2个字节,即16位
程序中,cp[0]保存了i地址中的0xfd ,cp[1]保存了 0x7f
由于已经存了16位数据,所以后面的cp[2]和cp[3]赋值为0

解决方案四:

你怎么这么糊涂,计算机里面,地址的指针都是一样大小的,32位系统,那不论你是什么类型的数据,这个数据的地址到时32位的。地址指针的长度是恒定的,不是说,浮点型就长,或者整形就短。并且,不管你把一个数据强制转换为什么数据,数据的首地址都是不会变的(以大端模式讨论),即指向这个数据的指针不变,因为当你在程序中定义这个变量的时候,就像系统申请了一段内存空间,知道这个变量的声明周期结束,它在内存中的位置是不会变的。

解决方案五:

你在main里声明的i和f两个变量在main里面所分配的地址是不同的,但在这里endian(int_cp(i), sizeof(i));调用,int_cp(i)这个地方所给的地址是一定一样的

解决方案六:

我已经要吐血了,你自己看看你的代码是怎么写的,
char_point int_cp(int i)
char_point float_cp(float f)
char_point cp = (char_point) &i;
return cp;
char_point cp = (char_point) &f;
return cp;
首先,你的函数时传值,至于为什么这两个形参传进来地址是一样的,你自己百度函数的入栈和出栈,还有编译器的优化。
第二,你说CP[I]的值为什么一样,你好好看看你写的代码,你把一个四字节的数强制转化为一个无符号的char * cp,然后你把这个CP
返回,在endian()中你从cp的开始往后访问,一共访问了四个字节。在你的函数入栈的时候,编译器发现你定义了两个四字节的变量,而且只用了
一次,i,f;第一次,i入栈,在栈底,假设地址为0Xabababab,当函数执行完了,i出栈了。但是又有一个函数,和上一次一样,也是带一个四字节的
参数,入栈的时候,编译器还是会分配上一次的堆栈给当前的函数用,那么F也是在栈底,地址理所当然是0xabababab。如果问,为什么两次的堆栈首地址
相同,那么你要去问当初编写编译器的的工程师。还有你程序的开头有个重定义,char_point 是无符号的字符指针。

解决方案七:

我不清楚其他人是怎么理解的,我个人理解你这个程序倒是没有错误,我说一下个人看法,不知道你能不能看懂

endian(int_cp(i), sizeof(i));
    endian(float_cp(f), sizeof(f));
    这两个经过函数调用,多加了一次指针指向,传入到endian的参数实际上变成指针的指针,多加了一层指针指向,
    所以这个函数调用打印的值是局部变量f或者i的地址 

    //endian((char_point) &i,  sizeof(i));
    //endian((char_point) &f,  sizeof(f));
            这个地方调用,传入的是i和f的地址,cp指针取值的的时候打印的就是i和f的对应值

如果不对 希望大神批评指点

时间: 2024-08-10 21:40:07

c语言-C语言指针相关问题,不能理解输出结果的相关文章

指针-c语言链表学生管理系统相关问题请教

问题描述 c语言链表学生管理系统相关问题请教 要做课程作业了,就学着网上模版写了个链表学生信息系统,但我想分成老师-学生两个登陆模块.思路如下: mian()中设置ahead结构体指针. 老师模块完成学生成绩的增删改查排序(借鉴网上的已完成)..老师模块结束后返回处理后的链表头指针,传递给学生模块,学生模块通过这个传递过来的指针进行访问信息链表,输入自己学号查询本人成绩. 结果,编译通过,老师模块成功了,学生模块没法用.所以想请教下这种思路对吗? 解决方案 思路是对的,只要老师建立的链表没错误,

c语言-为什么这里打印出来是乱码呢?(C语言指针相关)

问题描述 为什么这里打印出来是乱码呢?(C语言指针相关) 解决方案 soory,扫了一眼,没看清..你的temp[]数组是在函数中定义的,函数read调用后就其占用的内存(存在堆里)就被释放了,只返回了temp[0]对应的字符(存在栈里),这就导致你输出了一个字符后,后边就是乱码了,建议你可以将数组作为函数的参数,这样就不会有这个问题了. 解决方案二: 不好意思,貌似我把堆和栈弄反了, 解决方案三: 你的程序根本就是错的,不应该返回堆栈上局部变量temp的指针,你应该用new malloc分配内

C语言中改变目录的相关操作函数详解_C 语言

C语言fchdir()函数:改变当前工作目录头文件: #include <unistd.h> 定义函数: int fchdir(int fd); 函数说明:fchdir()用来将当前的工作目录改变成以参数fd 所指的文件描述词. 返回值:执行成功则返回 0, 失败返回-1, errno 为错误代码. 范例 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <

深入解析C语言中函数指针的定义与使用_C 语言

1.函数指针的定义    函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时,

讲解C语言编程中指针赋值的入门实例_C 语言

从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无

c语言 把邻接矩阵的相关数据存入文件中

问题描述 c语言 把邻接矩阵的相关数据存入文件中 MGraph CreatMG(MGraph g) { int i,j,k,n; cout<<"输入顶点数和边数"; cin>>g.n>>g.e; for(i=0;i<g.n;i++) { cout<<"序号为"<<i<<"的值"; cin>>g.vexs[i].data; g.vexs[i].no=i; }

C语言中常量指针与指针常量区别浅析

这篇文章主要介绍了C语言中常量指针与指针常量区别,有需要的朋友可以参考一下 常量指针是指--指向常量的指针,顾名思义,就是指针指向的是常量,即,它不能指向变量,它指向的内容不能被改变,不能通过指针来修改它指向的内容,但是指针自身不是常量,它自身的值可以改变,从而指向另一个常量. 指针常量是指--指针本身是常量.它指向的地址是不可改变的,但地址里的内容可以通过指针改变.它指向的地址将伴其一生,直到生命周期结束.有一点需要注意的是,指针常量在定义时必须同时赋初值. 注:也有人将这两个名称的定义与含义

struct-关于C语言结构体指针数组的问题

问题描述 关于C语言结构体指针数组的问题 //结构体struct student{ int iNum; char cName[16]; float fChineseScore; float fMathScore; float fEnglishScore;};typedef struct student STUDENT;//输入void InputTranscript(STUDENT MyClass[] int num){ int i; printf(""请输入学生的成绩信息:n&quo

Go语言中的指针运算实例分析_Golang

本文实例分析了Go语言中的指针运算方法.分享给大家供大家参考.具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西.最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据. 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的. 下面是实验代码: 复制代码 代码如下: packag