深入理解指针(6)
1. sizeof和strlen的对⽐1.1 sizeof在学习操作符的时候我们学习了 sizeof sizeof 计算变量所占内存空间⼤⼩的单位是字 节如果操作数是类型的话计算的是使⽤类型创建的变量所占内存空间的⼤⼩。 sizeof 只关注占⽤内存空间的⼤⼩不在乎内存中存放什么数据。⽐如#include stdio.h int main() { int a 10; printf(%d\n, sizeof(a)); printf(%d\n, sizeof a); printf(%d\n, sizeof(int)); return 0; }1.2 strlenstrlen 是C语⾔库函数功能是求字符串⻓度。函数原型如下size_t strlen ( const char * str );统计的是从 strlen 函数的参数 str 中这个地址开始向后 \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符直到找到为⽌所以可能存在越界查找。#include stdio.h int main() { char arr1[3] {a, b, c}; char arr2[] abc; printf(%d\n, strlen(arr1)); printf(%d\n, strlen(arr2)); printf(%d\n, sizeof(arr1)); printf(%d\n, sizeof(arr2)); return 0; }1.3 sizeof和strlen的对⽐2. 数组和指针笔试题解析数组名的意义1. sizeof(数组名)这⾥的数组名表⽰整个数组计算的是整个数组的⼤⼩。2. 数组名这⾥的数组名表⽰整个数组取出的是整个数组的地址。3. 除此之外所有的数组名都表⽰⾸元素的地址。2.1 ⼀维数组int a[] {1,2,3,4};printf(%d\n,sizeof(a)); printf(%d\n,sizeof(a0)); printf(%d\n,sizeof(*a)); printf(%d\n,sizeof(a1)); printf(%d\n,sizeof(a[1])); printf(%d\n,sizeof(a)); printf(%d\n,sizeof(*a)); printf(%d\n,sizeof(a1)); printf(%d\n,sizeof(a[0])); printf(%d\n,sizeof(a[0]1));2.2 字符数组代码1#include stdio.h int main() { char arr[] {a,b,c,d,e,f}; printf(%d\n, sizeof(arr)); printf(%d\n, sizeof(arr0)); printf(%d\n, sizeof(*arr)); printf(%d\n, sizeof(arr[1])); printf(%d\n, sizeof(arr)); printf(%d\n, sizeof(arr1)); printf(%d\n, sizeof(arr[0]1)); return 0; }代码2#include stdio.h #include string.h int main() { char arr[] {a,b,c,d,e,f}; printf(%d\n, strlen(arr)); printf(%d\n, strlen(arr0)); printf(%d\n, strlen(*arr)); printf(%d\n, strlen(arr[1])); printf(%d\n, strlen(arr)); printf(%d\n, strlen(arr1)); printf(%d\n, strlen(arr[0]1)); return 0; }代码3#include stdio.h int main() { char arr[] abcdef; printf(%d\n, sizeof(arr)); printf(%d\n, sizeof(arr0)); printf(%d\n, sizeof(*arr)); printf(%d\n, sizeof(arr[1])); printf(%d\n, sizeof(arr)); printf(%d\n, sizeof(arr1)); printf(%d\n, sizeof(arr[0]1)); return 0; }代码4#include stdio.h #include string.h int main() { char arr[] abcdef; printf(%d\n, strlen(arr)); printf(%d\n, strlen(arr0)); printf(%d\n, strlen(*arr)); printf(%d\n, strlen(arr[1])); printf(%d\n, strlen(arr)); printf(%d\n, strlen(arr1)); printf(%d\n, strlen(arr[0]1)); return 0; }代码5#include stdio.h int main() { char *p abcdef; printf(%d\n, sizeof(p)); printf(%d\n, sizeof(p1)); printf(%d\n, sizeof(*p)); printf(%d\n, sizeof(p[0])); printf(%d\n, sizeof(p)); printf(%d\n, sizeof(p1)); printf(%d\n, sizeof(p[0]1)); return 0; }代码6#include stdio.h #include string.h int main() { char *p abcdef; printf(%d\n, strlen(p)); printf(%d\n, strlen(p1)); printf(%d\n, strlen(*p)); printf(%d\n, strlen(p[0])); printf(%d\n, strlen(p)); printf(%d\n, strlen(p1)); printf(%d\n, strlen(p[0]1)); return 0; }2.3 ⼆维数组#include stdio.h int main() { int a[3][4] {0}; printf(%d\n,sizeof(a)); printf(%d\n,sizeof(a[0][0])) printf(%d\n,sizeof(a[0])); printf(%d\n,sizeof(a[0]1)); printf(%d\n,sizeof(*(a[0]1))); printf(%d\n,sizeof(a1)); printf(%d\n,sizeof(*(a1))); printf(%d\n,sizeof(a[0]1)); printf(%d\n,sizeof(*(a[0]1))); printf(%d\n,sizeof(*a)); printf(%d\n,sizeof(a[3])); return 0; }3. 指针运算笔试题解析3.1 题⽬1#include stdio.h int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(a 1); printf( %d,%d, *(a 1), *(ptr - 1)); return 0; } //程序的结果是什么3.2 题⽬2//在X86环境下 //假设结构体的⼤⼩是20个字节 //程序输出的结果是啥 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4]; }*p (struct Test*)0x100000; int main() { printf(%p\n, p 0x1); printf(%p\n, (unsigned long)p 0x1); printf(%p\n, (unsigned int*)p 0x1); return 0; }3.3 题⽬3#include stdio.h int main() { int a[3][2] { (0, 1), (2, 3), (4, 5) }; int *p; p a[0]; printf( %d, p[0]); return 0; }3.4 题⽬4//假设环境是x86环境程序输出的结果是啥 #include stdio.h int main() { int a[5][5]; int(*p)[4]; p a; printf( %p,%d\n, p[4][2] - a[4][2], p[4][2] - a[4][2]); return 0; }3.5 题⽬5#include stdio.h int main() { int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *ptr1 (int *)(aa 1); int *ptr2 (int *)(*(aa 1)); printf( %d,%d, *(ptr1 - 1), *(ptr2 - 1)); return 0; }#include stdio.h int main() { char *a[] {work,at,alibaba}; char**pa a; pa; printf(%s\n, *pa); return 0; }3.7 题⽬7#include stdio.h int main() { char *c[] {ENTER,NEW,POINT,FIRST}; char**cp[] {c3,c2,c1,c}; char***cpp cp; printf(%s\n, **cpp); printf(%s\n, *--*cpp3); printf(%s\n, *cpp[-2]3); printf(%s\n, cpp[-1][-1]1); return 0; }