指針
指針概念
????????指針保存地址,地址是字節的編號
????????指針類型和保存的地址類型要一直
????????使用時注意,把地址轉換為&變量的格式來看??????? int a[3];? a轉為&a[0]
指針的大小
????????64bit??????? 固定8字節,????????32bit??????? 固定4字節
指針的定義
????????格式:數據類型 變量名
????????指針的標識:
????????int a;
????????int a[3];? 先寫單個變量,變量名后加[]和元素個數
????????int *a;? 先寫單個變量,在變量名后面加*,表示指向該空間類型的指針
????????空間類型==地址類型==數據類型
多級指針
指針的初始化
????????指針不初始化--野指針,應避免野指針的出現
????????int *p=NULL;
int a=5;
int *p=&a;//初始化直接指向變量地址
char *p= “hello”;
char a[10]= “hello”;
指針的使用
????????* 乘法 雙目 1*2?
????????* 解指針/解地址 單目 *地址?
????????& 取地址 同空間變量獲取空間的地址?
????????* 解地址 通過空間地址找到空間變量?
????????所以*&可以抵消
int a=5;
int *p=&a;
int **q=&p;
int ***k=&q;
printf(“%d”, a);//5
printf(“%d”, *p);//5
printf(“%d”, **q);//5
printf(“%d”, ***k);//5
類型轉換
????????數據轉換:自動轉換,自動向高精度轉換
??????????????? 強制轉換:float a=3.14; printf("%d", (int)a);
????????地址轉換/空間類型轉換:強制轉換
int a=65;
char *p=(char *)&a;// &a 代表 4 字節空間地址 (char *)強制轉換為 1 字節空間地址
if(*p == 65)
{
printf(“小端\n”);
}
大小端
????????低位地址存高位數據??????? 大端存儲
????????低位地址存低位數據??????? 小端存儲
????????數據在進行網絡傳輸時,尤其是跨平臺和設備,會出現存儲方式不同而引起的數據錯誤,所以在發送數據之前需要進行大小端測試
地址偏移
????????地址加減,加減的是空間個數,空間的大小由空間類型決定
int a[5][20];
int *p=&a[0][0];
p+1 == &a[0][0]+1 == &a[0][1]
(int (*)[20])p+1 == &a[0]+1 == &a[1]
int (*q)[20]=&a[0]; // sizeof(q)==8
變量 q 先與*結合,所以 q 是指針
再與[20]結合,所以指針指向數組,數組有 20 個元素
最后與 int 結合,所以數組元素是整型變量
q+1 == &a[0]+1 == &a[1]
(int *)q+1 == &a[0][0]+1 == &a[0][1]
指針常量&&常量指針
關鍵字:const
功能:修飾變量為常量
int *p; // 整型指針
float *p; // 浮點型指針
char *p; // 字符指針
常量指針:指向常量的指針
數字常量 字符常量 字符串常量
指針常量:指針自己是常量
const char *p;//常量指針 const 修飾*p,指針指向的空間是常量
char const *p;//常量指針
char * const p;//指針常量 const 修飾 p,指針自身是常量
const char * const p;//常量指針常量
指針數組&&數組指針
int a[5];// 整型數組
float a[5];// 浮點型數組
char a[5];// 字符數組
指針數組:由指針組成的數組
int *a[5];// 整型指針數組
char *a[5];// 字符指針數組
數組指針:指向整個數組的指針
int (*p)[5];// 整型數組指針
int a[2][3];
int (*p[2])[3]; // 整型數組指針數組
p[0]=&a[0];
p[1]=&a[1];
二維字符數組&&字符指針數組
char a[3][5]={“123”, “456”, “789”}; // 二維字符數組a 字節大小:15
char *a[3]={“123789”, “456789”, “7896666666”}; // 字符指針數組a 字節大小:24printf(“%s\n”, a[1]+1); // 56789
附面試題:
1、地址為0x80000020的內存段存儲一個浮點型數據3.14
??????? float *p(float *)0x80000020;
??????? *p = 3.14;
2、
unsigned char *p=0x10000010;
(unsigned long *)p+2=0x10000020;
(unsigned long)p+2=0x10000012;
(char (*)[5])p+2=0x1000001A;
(short (**))p+2=0x10000020;
3、
#include <stdio.h>
int main()
{char *p = "%s,%d\n";char *a = "hello";printf(p,a,36);printf(p+3,36);printf("%s,%d\n","hello",36);return 0;
}