一、指针概述
内存类型资源地址、门牌号代名词。
指针:地址的代名词
指针变量:存放指针这个概念的盒子。
C语言编译器对指针这个特殊的概念,有两个疑问?
1、分配的一个盒子,盒子要多大?
在32bit系统中,指针就是4字节。
2、盒子存放的地址,所指向的内存读取方法是什么?
首先根据指针获取地址,然后根据*前面的修饰符获取一次处理的地址长度。
1GB
2^10 1K
2^20 1M
2^30 1G
指针指向的内存空间,一定要保证合法性。
二、指针+修饰符
const
常量、只读【不能变】
内存属性:
1、内存操作的大小(int、char ....)。
2、内存的变化,可读可写(const)。
char *p;
const char *p; 【T】 p指向的内容“不可修改”,可以修改指向的位置。
char const *p;
char * const p;【T】 p指向的地址不可修改,可以修改指向的内容。【硬件资源】
char *p const;
const char * const p; 【ROM】
char *p = "hello world!\n"; ===========> const char *p = "hello world!\n";
*p = 'a'; 非法,会出现段错误。
volatile
防止优化,指向内存地址。每次读取都会去读取指定地址内的数据,而不会优化去读缓存中的数据。
char *p;
volatile char *p;
typedef
别名。
char *name_t; //name_t是一个指针,指向了一个char类型的内存。
typedef char *name_t; //name_t是一个指针类型的别名,指向了一个char类型的内存。
name_t abc;
三、指针+运算符
++、--、+、-
int a = 100;
a + 1; //100 + 1
int *p = xxx ; //[0x12]地址
p+1; //[0x12 + 1*sizeof(*p)]地址
指针的加法、减法运算,实际上加减的是一个单位,单位大小可以使用sizeof(p[0])。
p++ p--:更新了p的地址。
[ ]
变量名[n]
n:ID标签号
地址内容的标签访问方式。
取出标签里的内存值。
---------------------------------------------------------------------------------------------------------------------------------
const int a = 0x12345678;
int b = 0x11223344;
a = 100; //编译器报错。
int *p = &b;
*(p + 1) = 100; // a = 100,使用指针越界可以修改const变量的值。变量内存从高地址分配。
逻辑操作符
==、!=
1.跟一个特殊的值进行比较。 0x0(NULL):无效值,结束标志
2.指针必须是同类型的比较才有意义(用的非常少)。
四、多级指针
int **p;
存放地址的地址空间(存放地址的内存里面存放的也是一个地址)。
p[m] == NULL;结束。