c语言==数据类型(4)

问:什么是数据类型?

答:是数据集合的划分,不同数据类型对CPU的意义是不一样的

右左法则

流程:先找到变量名,向右看,向左看,向右看,向左看……直至全部结束

例如:
int **a;
先找到变量名a,然后向右看,是个分号,代表着结束,说明这就是个变量,然后向左看,是一个指针,说明他是一个指针。所以a是一个指针变量,向右看没有了,向左看又是一个指针,这时候找的是原来那个指针变量代表着什么,说明原来那个指针变量里存放的是现在这个指针的地址,叫做指针的指针变量,然后继续找现在这个指针代表着什么,向右看又是什么都没有,向左看是一个整型,说明这个指针是一个整型指针,用来保存整型数的地址。所以总的来看。这是一个整型指针的指针变量。
这里写图片描述

int *a[10];
a:是一个指针数组,数组存放的是指针,指针指向的是整型数的地址,总称整型指针数组

int (*a)[10];
a:是一个指针变量,指针指向的是数组的地址,数组里存放的是整型数,总称整型数组指针变量。

int (*a)(int);
a:是一个函数指针变量,形式参数为整型,返回值为整型

int (*a[10])(int);
a:是一个函数指针数组

int * ( * ( *fp1)(int)) [10];
fp1:是一个函数指针变量,形式参数为整型,返回值为数组指针,数组里存放的是整型指针。

int * (* (*arr[5])()) ();
arr:是一个函数指针数组,数组里存放的指针,指针里存放的是无参的返回值为函数指针的函数的地址,现在这个指针保存的是一个无参的,返回值为整型指针的函数地址。

float (* (*b())【】) ();
b:是一个无参函数,返回值为数组指针,指针保存数组的地址,数组保存的是无参函数指针,返回值为float

void * (* c)(char a,int (*b)());
c:是一个函数指针变量,参数为字符型和函数指针,返回值为void *型

float (* (* e[10])(int *)) 【5】;
e:函数指针数组,参数为整型指针,返回值为数组指针,数组里存放的是浮点数。

强制转化

隐式类型转化:char < int < float < double

例如:

int num = 5int *p = &num;
char *ptr = p;

printf("%d\n" , p);
printf("%d\n" , *p);
printf("%c\n" , ptr);

此时输出结果为:
num的地址
5
不兼容的类型初始化

说明,从int到char,是不能够隐式转换的。

若将char *ptr = (char) p;
结果也是不对的,因为p的类型是int *, 是一个指针类型,不可以变成字符型,同时ptr字符指针也不可以变成一个字符型。

char *ptr = (char *)p;

printf("%c\n" , ptr);
printf("%d\n" , *ptr);

运行结果为:
p地址的一个字符
5


问:一些数据类型的字节长度

(内存存储单位:1字节=8位iwe(bit),半字=2个字节=16位,字=4个字节=32位,双字=8个字节=64位)
以字节为单位:
char:1
short:2
int:4
long:4
float:4
double:8
long long(64位操作系统):8
char *:4
short *:4
int *:4
float *:4
double *:4

问:为何所有的指针长度都是4?

答:因为指针保存的是地址,操作系统中的地址都是固定的,32位操作系统的地址字节长度就是4个字节,操作系统为64位,字节长度为8个字节。

如何求某个变量或数据类型的字节
利用sizeof这个运算符(注意不是函数)
命令:
sizeof + 变量名
或者 sizeof + (数据类型名)


char的内存存储范围是多少?
char是一个字节,8位
无符号时范围是0-255(0000 0000 - 1111 1111)
有符号范围是-128 - 127(1000 0000 - 0111 1111)

(负数都是以补码的形式存放在计算机内的)
求负数的补码
除符号位外,取反加1
已知负数补码求原码
依旧是取反加1

printf"%d\n" , ~2);

~是按位取反符,即每一位都要取反。
2的原码是0000 0010 各位取反就是 1111 1101
然后就变成负数了,在机器里负数都是按补码存放的,即1000 0011
输出结果为:-3

数据类型的一些tips(typedef)

1、为了提高代码的移植性,一般不直接用数据类型。
例如typedef unsigned char Char;
这样万一应用到别的不可以使用unsigned char的平台上时,就可以直接修改typedef了。
2、有时候为了让变量更加一目了然,会将数据类型改名
例如 typedef int Age;
在代码中,每个是年龄的变量都这样定义:Age a =30;

一些常识
1、有符号数和无符号数进行比较时,会将有符号数隐式转换成无符号数。
2、指针保存字符串的首地址
3、strlen是函数,要加#include

char *p = "hello world";
sizeof p = 4
strlen(p) = 11


char p[100] = "hello world";
sizeof p = 100
strlen p = 11


char p[] = "hello world";
sizeof p = 12
strlen p = 11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值