[C语言源代码][数据存储+指针] 谁还不会司空震?给我冲!

本文详细探讨了C语言中的数据存储方式及其与指针的关系。通过实例代码,深入理解指针如何作为数据存储的工具,帮助开发者更高效地操纵内存和数据结构。
摘要由CSDN通过智能技术生成
#define _CRT_SECURE_NO_WARNINGS
//数据在内存的存储
//整形: char也归纳为了整形类型了  因为char字符对应的是ASCII值(相对应的具体数字)
//#include<stdio.h>
//int main()//调试打开内存哦
//{
//	int number = -10;
//	/* 负数 原码10000000 00000000 00000000 00001010
//	      反码:10000000 11111111 11111111 11110101
//	       补码 11111111 11111111 11111111 11110111
//		   为啥负数用补码存储呢? 这样可以数据统一处理(CPU只有加法)
//	       原码 -> 补码 (按位取反+1)
//		   100000000 00000000 00000000 00001000按位取反
//		   100000000 00000000 00000000 00001001加一又回去了
//	      16进制    ff         ff    ff       f 6
//		   大小端:低地址放低位,高地址放高位 ->小端存储 ; 低地址放高位,高地址放低位 -> 大端存储
//	*/
//	return 0;
//}
//写一个代码,判断当前编译器是大端还是小端
//#include<stdio.h>
//int main()
//{
//	int number = 1;
//	char* point = (char*)&number;
//	if (*point == 1) {
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}
//牛刀小试
//1.这个式子打印的结果是啥
//#include<stdio.h>
//int main() {
//	char number1 = -1;
//	// 10000000 00000000 00000000 00000001原码
//	// 11111111 11111111 11111111 11111111补码
//	// 截断 11111111
//	// %d方式打印  11111111 11111111 11111111 11111111补码 -> 10000000 00000000 00000000 00000001原码
//	signed number2 = -1;
//	// -1
//	unsigned char number3 = -1;
//	// 11111111 unsigned无符号%d形式打印 00000000 00000000 00000000 11111111 
//	printf("%d %d %d\n", number1, number2, number3);//  -1  -1  255
//	return 0;
//}
/*
     补充一点 char到底是signed char还是unsigned char ?C语言是没有规定的;但int啊,short啊是signed int(short)

     char 00000000(0)……01111111(127) ->10000000(11111111 11111111 11111111 10000000十进制-128)(-128)->100000001(原码11111111)(-127)……11111111(原码10000001)(-1)
     char类型的范围 -128 到 127
     无符号的char 00000000(0)->00000001(1)->01111111(127)->10000000(128)无符号位->10000001(129)->11111111(255)
*/
//2.这个式子打印的结果是啥
//#include<stdio.h>
//int main() {
//    char number = -128;
//    // 10000000 %u无符号打印 11111111 11111111 11111111 10000000
//    /*
//       10000000 00000000 00000000 10000000 原码
//       11111111 11111111 11111111 011111111  反码
//       11111111 11111111 11111111 10000000 补码
//    */
//    printf("%u\n", number);//一个很大的数
//    return 0;
//}
//3.这个式子打印的结果是啥
//#include<stdio.h>
//int main() {
//    char number = 128;
//    //00000000 00000000 00000000 10000000
//    //10000000 %u无符号打印整形 11111111 11111111 11111111 10000000
//    printf("%u\n", number);//很大的数
//    return 0;
//}
// 4.这个式子打印的结果是啥
//#include<stdio.h>
//int main() {
//    unsigned int number = 0;//无符号整形没有负数啊
//    for (number = 9; number >= 0; number--) {//条件恒成立嘛
//        printf("%u\n", number);
//    }
//    return 0;
//}
//5.这个式子打印的结果是啥
//#include<stdio.h>
//#include<string.h>
//int main() {
//    char array[1000];
//    int number;
//    for (number = 0; number < 1000; number++) {
//        array[number] = -1 - number;
//   // -1 -2……-128 127 126……0
//    }
//    printf("%d\n", strlen(array));//strlen遇到\0结束 255
//    return 0;
//}
//6.这个式子打印的结果是啥
//#include<stdio.h>
//unsigned char number = 0;
//int main() {
//    for (number = 0; number <= 255; number++) {//死循环
//        printf("你还是太年轻\n");
//    }
//    return 0;
//}
//浮点类型在内存中的存储
/*
       浮点数表示方法:第一种直接写出来 3.1415926 ; 第二种用科学计数法表示  1E10(1.0*10^10)

       根据国际标准IEEE(电器和电子工程协会)754规定,任意一个二进制浮点数表示形式为 (-1)^s * M * 2^E  ;(-1)^s为符号位 s为0则为正数,s为1则为负数 ;M为有效数 1<=M<2 ;2^E表示指数位
       
       举个例子来说 十进制5.0写成二进制   (-1)^0 * 1.01 * 2^2   ;  5.5   (-1)^1 * 1.011 * 2^2 

       float   32个bit位   0(符号位)00000000(8bit指数位) 00000000 00000000 0000000(23bit有效值位)
       double  8字节64bit位   1bit为符号位  11bit为指数位  52bit为有效值位

       IEEE754对有效数M和指数E有一些特别规定
       M的取值范围 1<=M<2 ,它可以写成1.xxxx,其中xxxx为小数部分,在计算机保存M时,默认这个第一位总是1,因此可以被舍弃,只保留小数,等读取时再把1加上去,这样节省了一位有效数字,float可以保存24位有效数字了
       E为一个无符号整数,这意味着如果E为8位,取值范围为(0-255)(11位 0-2047);但是科学计数法E可以为负数的,所以IEEE754规定,存E的时候需要加一个中间数,8位E+127(11位+1023) ;例如2^10 ,E=10,10+127=137 即10001001
       
       指数E从内存中取出还有三种情况
       E为不全0或不全1的 
       E为全0   E为8位时+127 ;11位+1023 还E为0 说明这是一个很小的数,这时浮点数的指数E等于1-127(1-1023)即为真实值,有效数字M不在加上1,这样做表示正负0,以及很小的数字
       E为全1   正(负)无穷大 取决于符号位
*/
//#include<stdio.h>
//int main() {
//    float Number = 9.0;
//   // 0 10000010 00100000 00000000 0000000
//   //   4    1    1   0    0 0 0 0
//    int number = 9;
//    float* pFloat = (float*)&number;
//    printf("number的值=%d\n", number);//无可置疑 9
//    printf("*pFloat的值=%f\n", *pFloat);// 0 00000000 00000000 00000000 0001001   
//    *pFloat = 9.0;
//    printf("number的值=%d\n", number);// 0 10000010 00100000 00000000 0000000 很大的数字
//    printf("*pFloat的值=%f\n", *pFloat);// 毋庸置疑9.0
//    return 0;
//}

//讲一下进阶指针
//1.字符指针
//#include<stdio.h>
//int main() {
//    /*  字符指针的一般使用
//    char happy = 'A';
//    char* point = &happy;
//    *point = 'a';
//    printf("%c\n", *point);*/
//    char *word = "HelloWord";//字符串常量不能改
//    char array[] = "HelloWord";//字符串在数组存放可以改
//    array[0] = 'A';
//    printf("%c\n", *word);//本质是把这个字符串 "HelloWord" 首字符存在了word中
//
//    printf("%s\n", word);
//    printf("%s\n", array);
//
//    return 0;
//}
//小试牛刀一下
//#include<stdio.h>
//int main() {
//    char array1[] = "HelloWorld";
//    char array2[] = "HelloWorld";
//    const char *array3 = "HelloWorld";//字符串常量(加上const 是不是代码更健壮了一点呢??)
//    const char *array4 = "HelloWorld";
//    if (array1 == array2) {
//        printf("1相等\n");
//    }
//    else {
//        printf("1不相等\n");//数组内容相同,但是需要开辟不同的空间来存放数组的,所以不相等
//    }if (array3 == array4) {
//        printf("2相等\n");//字符串常量,又是指针指向,他们指向同一个位置
//    }
//    else {
//        printf("2不相等\n");
//    }
//    return 0;
//}

//指针数组  存放指针的数组
//#include<stdio.h>
//int main() {
//    //一种尴尬的写法
//    int number1 = 10;
//    int number2 = 20;
//    int number3 = 30;
//    int* array[] = {&number1,&number2 ,&number3};
//    int frequency = 0;
//    for (frequency = 0; frequency < 3; frequency++) {
//        printf("%d ", *(array[frequency]));
//    }
//    printf("\n");
//    //搞起来
//    int array1[] = { 1, 2, 3, 4, 5 };
//    int array2[] = { 6, 7, 8, 9, 10 };
//    int array3[] = { 11, 12, 13, 14, 15 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手冰凉ya

你的鼓励是我最大动力谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值