1.指針數組
1)關於指針數組
一個數組,里面存儲的是指針(也就是帶*的類型)
指針數組:
char* arr[5] = {0}; //用0填充數組
arr[0] = (char*)1;
arr[1] = (char*)2;
arr[2] = (char*)3;
arr[3] = (char*)4;
arr[4] = (char*)5;
char a1 = 'A';
char a2 = 'B';
char a3 = 'C';
char a4 = 'D';
char a5 = 'E';
char* p1 = &a1;
char* p2 = &a2;
char* p3 = &a3;
char* p4 = &a4;
char* p5 = &a5;
char* arr[5] = {p1,p2,p3,p4,p5};
指針數組在內存中存儲的方式:

2)指針數組的用法
1】字符串放在常量區,常量區的字符串地址存入指針數組
char* p1 = "if";
char* p2 = "for";
char* p3 = "while";
char* p4 = "switch";
char* keyword[] = {p1,p2,p3,p4};
2】和上一種方式的效果一樣,實際上指針數組存放的是常量區字符串的地址;
char* keyword[] =
{
"if",
"for",
"while",
"switch"
};
2.結構體指針
一個結構類型帶一個*;
1)特征
和基礎數據類型的指針特性一樣:
可以++、--;
+整數、-整數,並且結果為加減整數乘結構體寬度;
兩個相同的結構體指針可以相減,結果為int型(相減結果/結構體寬度);
相同的結構體指針可以比較大小;
ps:也可以將普通指針強轉成結構體指針;但是訪問數據時是按結構體的方式來讀,讀取的數據可能不正確或者無法訪問;
2)用結構體指針操作結構體
sturct Student{
int a;
int b;
int c;
};
//創建結構體
Student s;
s.a = 10;
s.b = 20;
s.c = 30;
//聲明結構體指針
Student* ps;
//為結構體指針賦值
ps = &s;
//通過指針讀取數據
printf("%d\n",ps->a); //用“->”符號訪問結構體內容;
//通過指針修改數據
ps->a = 100;
printf("%d\n",ps->a);
3.實例
代碼:
#include "stdafx.h"
typedef struct Player{
int id;
int level;
} st;
//從中找id=1,level=8的結構體數據
char arr[100]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,
0x01,0x00,0x00,0x00,0x08,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
void fun(){
for(int i=0;i<=100-8;i++){
st* s = (st*)(arr+i); //將char*強轉為結構體指針
if(s->id==1 && s->level==8){
printf("%d ->%x",i,arr+i);
}
}
}
int main(int argc, char* argv[])
{
fun();
getchar();
return 0;
}
結果:
