深入理解深入理解C语言指针语言指针
指针是一种数据类型
指针也是一种变量,占有内存空间,用来保存内存地址
指针就是告诉编译器,开辟4个字节的存储空间(32位系统),无论是几级指针都是一样的
*p操作内存操作内存
在指针声明时,* 号表示所声明的变量为指针
在指针使用时,* 号表示操作指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
指针变量和它指向的内存块是两个不同的概念指针变量和它指向的内存块是两个不同的概念
给p赋值p = 0x1111;只会改变指针变量值,不会改变所指的内容;p = p +1;“p++
给*p赋值*p=’a’;不会改变指针变量的值,只会改变所指的内存块的值
等号左边*p表示给内存赋值,等号右边*p表示取值,含义完全不同
等号左边char *p(处理字符串,指针指向字符串首地址:char *p = buf;p++;)
保证所指的内存块能修改,即不要出现野指针和指向系统内存区域以及修改常量区数据
指针是一种数据类型,是指它指向的内存空间的数据类型指针是一种数据类型,是指它指向的内存空间的数据类型
指针步长(p++),根据所致内存空间的数据类型来确定
p++ = (unsigned char )p + sizeof(a);
结论:指针的步长,根据所指内存空间类型来定
通过通过*p/*p++ 来改变变量的值是指针存在的最大意义来改变变量的值是指针存在的最大意义
指针变量和它指向的内存块变量
这完全是两码事
指针指向某个变量,就是把某个变量地址否给指针
指针实际上记录的就是地址
*p间接赋值成立条件间接赋值成立条件
需要满足三个条件
2个变量(通常一个实参,一个形参)
建立关系,实参取地址赋给形参指针
*p形参去间接修改实参的值
int num = 0; //实参
int *p = NULL;
p = #
num = 1;
*p = 2; //通过*形参 间接 地改变实参的值
间接赋值的应用场景
在一个函数之内:
*p1++ = *p2++;
函数调用:
int getStr(int *a)
{
···
}
函数调用时函数调用时,用用n指针(形参)改变指针(形参)改变n-1指针(实参)的值指针(实参)的值
改变0级指针(e.g. int num = 1)的值有2种方式
改变1级指针(e.g. char *p = 0x1111)的值,有2种方式
改变2级指针的(e.g. char **pp = 0x1111)的值,有2种方式
函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来