指针的定义
int *p char *p float *p
指针定义的含义:* 声明其为指针 前面的类型告诉指针这个地址中存放的是什么类型的值(取出来时应该取多少个自己,或者进行加减运算时应该怎么计算地址)
指针变量所占内存的大小
跟前面定义的类型无关 而跟系统有关
16bits操作系统:2B
32bits操作系统:4B
64bits操作系统:8B
指针指向一个值所在的第一个字节(通常一个地址存放一个字节)
const修饰指针
*左边是修饰指针指向内存的值:如 const int *p int const * p ----- 内存地址可变,但是内存中的值不能被修改
*右边是修饰指针所指向的地址:如 int * const p 内存地址不可变 但是内存中的值可变
指针指向一个字符串时:如 char * p = “AAAAAA\n” 等价于 const char * p = “AAAAAA\n”
p是指向该字符串的首地址,这种字符串在初始化时是为const类型 要跟char数组初始化时区别开来
volatile和typedef
volatile :防止优化 确保本条指令不会因编译器的优化而省略,且要求每次直接读值
volatile int a[2]; a[0]=1; a[0]=2; a[0]=3; 编译器会优化为只生成 a[0]=3 这条语句的机器代码
typedef:重定义符
char * type; ----type为char类型的指针变量 指向一段char类型的内存
typedef char * type; ----type为char类型指针的别名
指针的加减操作
指针的加减等同于:type p p+n(宏观)= p+nsizeof(type)(微观)
C语言在定义同个类型的多个变量时 其地址是连续的
如:int a=0x12345678,b=0x999999998;
int *p=&b;
p+1==a; //小端模式 低字节放在低地址
指针的逻辑运算(大部分用到 == 和 !=)
0x0是一个无效地址,即NULL 用NULL判断一个指针是够无效
多级指针
如:char **p ----指针中存放指针的地址
标准main函数写法
int main(int argc,char **argv) —argc参数的个数 argv存放参数