指針是指向內存中某條數據的地址,簡單來說,指針就是數據的地址編號;舉個例子,小明住在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算法
- 紅包金額分配