指针是指向内存中某条数据的地址,简单来说,指针就是数据的地址编号;举个例子,小明住在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号
- php
- 编译安装
- 基本概念
- 垃圾回收机制
- 生命周期
- zval底层实现
- c扩展开发
- gdb调试工具
- 自定义扩展简单demo
- 钩子函数
- 读取php.ini配置
- 数组
- 函数
- 类
- yaf扩展底层源码
- swoole扩展底层源码
- memoryGlobal内存池
- swoole协程使用记录
- 单点登录sso原理
- compser使用
- session实现机制
- c & linux
- gcc
- 指针
- 结构体,联合和位字段
- 宏定义井号说明
- printf家族函数和可变参数
- 共享函数
- 静态库和动态库
- makefile自动化构建
- 信号一
- 信号二
- inotify监控文件事件
- socket编程
- 简介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路复用
- 内存管理
- 进程组,会话和控制终端
- daemon守护进程
- 多进程
- 多线程
- 常用进制转换
- go
- 入门知识
- 字节和整数装换
- python
- redis
- 应用场景
- 消息队列
- 热点数据
- 扫码登录
- 订阅发布
- 次数限制
- 抢购超卖
- 持久化机制
- mysql
- 工作流程
- MyISAM和InnoDB区别
- 用户和权限管理
- 执行计划
- sql优化
- 事务和锁
- 慢查询日志
- case...when...then...end用法
- sql
- 参考
- linux
- 内核参数优化
- 防火墙设置
- docker
- docker入门知识
- 算法
- 多维数组合
- DFA算法
- 红包金额分配