topnetfish / hello-world

hello-world repository
1 stars 0 forks source link

指针差异 #2

Open topnetfish opened 5 years ago

topnetfish commented 5 years ago

•数组和指针不可互换场景;•数组和指针可互换场景•多维数组和指针•数组和指针初始化 指针用法 char ch = 'c'; char pch = &ch; char pStr = “abc”;

int m; int *pm = &m;

strcut Test stTest; strcut Test *pst = &stTest;

extern void TestFunc(int m); void (*pf)(int) = TestFunc;

数组用法 char m1[10]; char m2[] = "123"; char m3[] = {'1','2'};

int m4[3][2]; int *m5[10];

数组访问:获取test[1]的步骤:test表示数组起始地址,先获得其地址test地址加上偏移,获取具体值 int Test1() { char test[] = {'1','2','3', '4', '5'}; int m = test[1]; return m; }

指针访问:获取test[3]的步骤:先获取test变量地址。获取test地址的数据,即”12345”地址。上面的”12345”首地址+偏移获取具体值 int Test2() { char *test = "12345"; int m = test[3];

return m;

}

数组和指针不可互换场景:sizeof char arr[] = "123"; int m = sizeof(arr);

char *pstr = "123"; int m = sizeof(pstr);

数组和指针可互换场景(1):函数参数 void TestArray_1(char test[10]) { int m = sizeof(test); }

void TestArray_2(char test[]) { int m = sizeof(test); }

void TestPointer(char *test) { int m = sizeof(test); }

数组和指针可互换场景(2):表达式 char arr[] = "123456"; char ch = arr[2];

char pstr = "123456"; char ch2= (pstr+2); 注意:表达式中,arr[i]总是被编译器翻译成*(arr + i )

多维数组和指针(1):步长 什么是步长:数组或者指针地址,偏移一步的内存大小 char a[10]; // 假设a起始地址:0x100---------------(a+1) = ? 0x101

int b[5]; // 假设b起始地址:0x100 -------(b+1) = ? 0x104

int c[4][2]; // 假设c起始地址:0x100 ------(c+1) = ? 0x108 ----------------(*(c+1) + 1) = ? 0x10C

多维数组和指针(3):函数形参 一维数组 void Test_1(char p[10]); void Test_2(char p[]); void Test_3(char p); 二维数组 void Test_1(char p[10][2]); void Test_2(char p[][2]); void Test_3(char (p)[2]);

注意:形参数组,均会被编译成指针。

数组和指针初始化(1):一维 int test_1[10]; int *test_2;

int test_3[10] = {1,2,3}; int test_4[] = {1,2,3}; char test_5[] = "123";

int m = 0; int *test_6=&m;

test_1[5] = ? 未知或者0

test_2[5] = ? 未知

test_3[5] = ? 0

test_4[2] = ? 3

test_5[5] = ? 未知

sizeof(test_5)=? 4(包含'\0)

请按照功能定义字数组: 定义一个二维数组,用来存放二维地图,其中X轴最大10,Y轴最大20。数据为int型。 定义一个三维数组,用来存放三维地图,其中X轴最大10,Y轴最大20,Z轴最大30。数据为int型。 定义一个数组,数组有10个,每个数组中,存放一个字符串指针。 申明一个函数,函数返回一个二维数组地图,其中最右边空间为10,数据为int型。

参考: 1) int map_1[20][10]; 2) int map_2[30][20][10]; 3) char str_1[10]; 4) int (Func())[10];