ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
指针是指向内存中某条数据的地址,简单来说,指针就是数据的地址编号;举个例子,小明住在802号房,802号就是指针;那么指针有什么作用呢,一般用来共享数据和避免副本 #### 指针使用 声明指针变量 (类型 + *) ```c int *address ``` 获取指针变量对应的值 (*) ```c int value = *address ``` 改变地址中的内容 ```c *address = 99 ``` 获取指针大小 (32位系统返回4,64位系统返回8) ```c sizeof(指针) ``` 指针运算 (和指针类型有关) ```c address++ ``` #### 数组和指针 数组变量可以用作指针,指向数组第一个元素的地址,如果吧函数参数声明为数组,它会被当做指针处理 ```c void read_msg(char msg[]) { // 结果为指针的长度,而不是数组的长度 printf("msg has %i bytes \n", sizeof(msg)) } char msg = "hello world"; read_msg(msg); ``` 以上函数等价于: ```c void read_msg(char msg[]) // 等价于 void read_msg(char *msg) ``` 指针的数组 ```c char *songs[] = {"平凡之路","天路","2002年的第一场雪"}; // songs[0]指向平凡之路第一个字节地址 // songs[1]指向天路第一个字节地址 // songs[3]指向2002年的第一场雪第一个字节地址 ``` #### 字符串和指针 可以把字符串当做数组对待,这里需要说明的是字符串字面值(即一个常量值)不能更新问题,如下: ```c char *msg = "wuzhc"; // 不能修改wuzhc char msg[] = "wuzhc"; // 可以修改wuzhc ``` 当程序加载到内存时,所有常量值会被保存到常量存储区(只读);*msg表示栈中msg的值保存一个执行常量值的地址,因为常量存储器是只读的,所以不能修改;而msg[]表示栈中msg的值保存常量值wuzhc一个副本,这个副本是可以修改的 ```c const char *msg = "wuzhc"; // 确保使用const,才是正确的 ``` #### 二级指针 即指针指向存放指针地址的地址,有点绕...,举个例子,私房钱放在001号盒子里,然后把001号记录到101页的书上;通过101页可以找到001号,然后根据001号找到盒子的私房钱;其中101页就是一个二级指针,它存放了另一个地址001号