指针的定义或初始化
基类型 * 指针变量名;
(1) (2) (3)
示例:
int * p
这里的基类型是指被指向的数据类型是什么类型,在64位下,指针类型所占据的空间都是八个字节(一个字节八位二进制数)
这里的*是指定义了指针类型变量的提示符,与之后*运算不同。
int a = 10;
int *p = &a; //意识是p的值是a的地址
int a = 10;
int *p;
*p = &a; //这是不可行的,*p是指p地址上的值
p=&a; //这是可行的,p本身就是需要一个地址为值
int *p; //定义指针却不初始化,指针值是随机的
int *p=NULL; //0号地址
利用指针,可以验证电脑是大端还是小端模式
int num = 0x12345678;
char* p = (char*)#
printf(0x%02x\n", *(p + i));
得到结果【0x78】说明低位存在低位,是小端模式
指针类型允许的计算
p+N //注意: 运算结果还是指针 表示的含义 p+N*sizeof(基类型) ---p指向了第N+1个基类型
p-N //与p+N相同
p++ //表示加了一个基类型的大小
p--
p-q //两个指针相减,运算结果表示 两个地址间 差了几个基类型
关系运算
> >= < <= == != //都是可以的
指针——一维整型数组
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &a[0];
int *p = a; //说 p指向了数组a,这里a作为数组名退化为首元素地址,也就是&a[0]
初始化完成后对p也就是地址做*运算可以得到a[0]的值,p本身存储的是地址。拓展开来有下式
*(p+i) <=> a[i]
const
const基本用法:
const int a = 10; //限定a为只读 ---空间还是栈上,但是只能读,不能改
const----指针:
const char *s //这个限定仅仅是限定了s地址所指向的值不能通过 *s的方式进行修改,也可以直接修改s(地址),就是不能通过*s修改s所指的值
char const *s //与上式等价
char *const s //const 离s近,就是用来限定的s的,表示s在定义后,就不能再指向别的地址了
const char * const s; //s不能修改 *s也不能修改
能在形参写作const char *s的直接写,可以在编译阶段就帮助我们发现错误(修改了不能修改的值)
二级指针
二级指针,也就是指针的指针,在二维数组有用到。
一个易错点:C 语言是值传递,形参是实参的副本。如果直接把指针传进去,函数内修改的是副本,外部的指针不会变。
所以想要在函数内让指针置空,需要二级指针。(在数据结构中,想要用函数删掉整个链式结构时可以用)
一般情况下只需要在指针同域令其直接置空即可
void set_null_good(int **p) { *p = NULL; // 对二级指针解引用,修改外部指针变量的值 } int *ptr = malloc(4); free(ptr); set_null_good(&ptr); // 传入指针的地址 if (ptr == NULL) { printf("已成功置空\n"); }