三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

C语言----指针

C语言----指针

指针的定义或初始化

基类型 * 指针变量名;
(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"); }
← 返回列表