东莞市建设公共交易中心网站首页,网站建设教学,php js做网站,wordpress 代码执行文章目录0. 补充知识数组笔试题1. 一维数组1.1 字符数组1.1.1 sizeof1.1.2 strlen1.2 二维数组2. 指针笔试题0. 补充知识 在进入数组与指针的练习时#xff0c;我们先来复习以下以下的知识点#xff0c;这可以帮助我们更好的理解下面练习 数组是一组能存放相同类型的类型的元…
文章目录0. 补充知识数组笔试题1. 一维数组1.1 字符数组1.1.1 sizeof1.1.2 strlen1.2 二维数组2. 指针笔试题0. 补充知识 在进入数组与指针的练习时我们先来复习以下以下的知识点这可以帮助我们更好的理解下面练习 数组是一组能存放相同类型的类型的元素数组的大小取决于数组元素个数和元素类型指针是地址口头语的指针是指针变量大小是4/8字节数组是数组指针是指针两者不等价只有在传参时数组会退化为指针数组名是首元素的地址这个地址可以存放在指针变量中因此可以将数组和指针练习起来二维数组arr[m][n]可以看成是一个有m个元素的一维数组每个数组元素是一个有n个元素的一维数组因此二维数组名是有n个元素的一维数组的地址多维数组以此类推只有当数组名单独放在sizeof内部和数组名时数组名才代表整个数组其余情况数组名代表首元素的地址sizeof是编译期间进行的操作符它是根据表达式的类型属性来进行求值因此不需要知道表达式的值属性也不会对表达式进行运算strlen是函数函数的型参是const char* 通常实参是char*可以将char*传给更安全的const char*,如果传的参数不是const char*类型则在函数体内部会自动转换成const char*来处理访问为定义地址时不是一定会报错如果访问的地址没有被其他程序调用则不会报错如果该地址被其他程序调用则会报错指针类型决定了(1)指针加减整数跳过的空间有多大(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));1.1 字符数组
1.1.1 sizeof 1.1.2 strlen 注在34行中访问了未定义的地址当这个地址被其他程序调用时会出现程序崩溃否则不会崩溃 可以看见程序崩溃后不会整形崩溃语句的后面语句 1.2 二维数组 注sizeof不会对表达式进行运算因此没有访问a[3]没有越界访问 2. 指针笔试题 2. p是一个大小为20字节的结构体指针指针整数的意义是跳过多少个字节因此p0x1相当于跳过1个结构体大小20个字节第一个答案就是00100014将p强转为unsigned long类型为整形整形0x1就是数值上1因此答案是00100001将p强转为unsigned int*类型为指针1表示跨过一个int型因此答案是00100004 注:%p打印格式是8位16进制高位不足补0 ptr1指向a[3]后面的一个元素ptr[-1]代表*(ptr1-1),表示访问ptr1前面4个字节的元素即arr[3]ptr2情况较复杂我们画字节数据的存储图字节内容以16进制表示(以小端存储为例) a原本是int*类型的数据值是01的强转为int型在1最后ptr2指向该位置 在解引用访问从ptr2向后面的4个字节因为是小端存储所以解引用得到的值是0x02000000 注%x是有多少位16进制就打印多少位16进制 逗号表达式的值是最后一个表达式的值因此数组a只有前3个元素赋值了1,3,5 pa[0],因此p[0]相当于a[0][0]答案为1 p是一个指向具有4个元素数组的指针可以看作是列数为4的二维数组名 二维数组在内存中是连续存放的因此二维数组元素arr[i][j]实际上是arr[0][0]后面i*列数j个位置的元素 p的列数是4a的列数是5 着重理解指针类型的意义 ptr1指向aa[1][4]后面一个整形,ptr1-1指向aa[1][4] ptr2指向aa[1][0],ptr2-1指向aa[0][4] pa原本指向a[0],pa后指向a[1],*pa得到a[1]的值即“at”的地址