#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 };
[C语言源代码][数据存储+指针] 谁还不会司空震?给我冲!
本文详细探讨了C语言中的数据存储方式及其与指针的关系。通过实例代码,深入理解指针如何作为数据存储的工具,帮助开发者更高效地操纵内存和数据结构。
摘要由CSDN通过智能技术生成