1. 指针是什么
- 指针是个类型!,数据类型
- 类型是干嘛用的,标注数据长度,做语法提示的。
#include <stdio.h>
int main() {
char a = 1;
char *b = &a;
*b = 9999;
printf("%d\n", *b);
/*char是-127--127,指针也是数据类型,也会标注长度,大类型转小类型会截取*/
}
2.指针的值
指针的值有三种,句柄,地址,空指针
空指针
char * b = NULL;
空指针就是占位
地址
#include <stdio.h>
int main() {
char a = 1;
char *b = &a;
}
指针的值是一个地址,地址就是房间号,大小是八个字节
#include <stdio.h>
int main() {
char a = 1;
char *b = &a;
printf("%d", sizeof(&a));//值是8
}
这个大小,和操作系统有关,32位系统是4字节,64位系统是8字节。
32位操作系统最大内存是4g,大概,32位系统,指针大小是4字节,也就是个int大小,四字节是32位,指针是存地址用的,也就是说这个地址长度是32位,也就是能存的东西是32^2,也就是4294967296 这个数/8,就是536870912 /1024大概事是54288,这是kb,算下来内存4gb左右。
-
为什么32位的系统指针是四字节, 64位系统的指针是八字节?
因为32位字长的系统的虚拟地址空间是
2^32 - 1
为了表示所有的地址,所以指针的大小必须大于等于2^32 - 1
, 所以就是4字节(32位)64位系统同理
指针就是个数字,八字节,说他是地址,只不过里面存的是数字,大一点而已。
-
long long 也是八字节,指针和long long 有啥区别
那就是不同类型,对运算符计算结果不一样,
#include <stdio.h>
int main() {
int a = 1;
int *p = &a;
long long lp = (long long)p;
printf("p = %lld\n", (long long)p);
printf("lp = %lld\n", lp);
}//一个指针一个long long
#include <stdio.h>
int main() {
int a = 1;
int *p = &a;
long long lp = (long long)p;
printf("p = %lld\n", (long long)p);
printf("lp = %lld\n", lp);
p++;
lp++;
printf("new_p = %lld\n", (long long)p);
printf("new_lp = %lld\n", lp);
return 0;
}
int型指针,p+1其实是加4
long long类型指针p+1就是+8
加号运算符就是n+m *sizeof(type)
n是原始数字,m是加数,type是指针的类型
比如指针类型是int ,p+2就是p+8
概括:指针也是普通的数字,指针运算符结果和整形不同
*运算符
-
*星号是指针声明的符号
用int*类型保存了a的地址
星号出现在等号左边和类型声明结合的话,就是声明的,直接*,就是解引用
#include <stdio.h> int main() { int a = 1;