C语言—指针(3)
嘿嘿嘿嘿,你看我像指针吗?
不会写,等我啥时候会写了再说吧,真的累了,倦了
1.面试题
1)定义整形变量i;
2)p为指向整形变量的指针变量;
3)定义整形一维数组p,它有n 个整形元素;
4)定义一维指针数组p,它有n个指向整形变量的指针元素;
5)定义p为指向(含有n个整形元素的一维数组)的指针变量;
6)p为返回整形函数值的函数;
7)p为返回一个指针的函数,该指针指向整形数据;
8)p为指向函数的指针变量,该函数返回一个整形值;
9)p是一个指向整形指针变量的指针变量;
嘿嘿我猜是这样的,没时间了就这样凑合吧,我写给自己看的
#include <stdio.h>int main() {int i; // 1.定义整形变量iint *p; // 2.p为指向整形变量的指针变量int arr[n]; // 3.定义整形一维数组p,它有n个整形元素// 注意:C99及以后标准才支持变量长度数组,或者在定义数组时已知n的具体值int *p[n]; // 4.定义一维指针数组p,它有n个指向整形变量的指针元素int (*p)[n]; // 5.定义p为指向(含有n个整形元素的一维数组)的指针变量int p(); // 6.p为返回整形函数值的函数int *p(); // 7.p为返回一个指针的函数,该指针指向整形数据int (*p)(); // 8.p为指向函数的指针变量,该函数返回一个整形值int **p; // 9.p是一个指向整形指针变量的指针变量return 0;
}
2.动态申请一个具有10个float类型元素的内存空间,从一个已有的数组中拷贝数据,并找出第一次出现 12.35 的下标位置,并输出。
/*2.动态申请一个具有10个float类型元素的内存空间,从一个已有的数组中拷贝数据并找出第一次出现 12.35 的下标位置,并输出.*/#include <stdio.h>
#include <stdlib.h>int main() {float existingArray[] = {1.1, 2.2, 3.3, 4.4, 5.5, 12.35, 7.7, 8.8, 9.9, 10.1};float *dynamicArray = NULL;// 动态申请内存dynamicArray = (float *)malloc(10 * sizeof(float));if (!dynamicArray){puts("malloc failed!");return -1;}// 从已有的数组中拷贝数据for (int i = 0; i < 10; i++){dynamicArray[i] = existingArray[i];}// 查找第一次出现12.35的位置int index = -1;for (int i = 0; i < 10; i++){if (dynamicArray[i] == (float)12.35){index = i;break;}}if(index != -1){printf("第一次出现12.35的位置是: %d\n",index);}else{printf("未在数组中找到12.35\n");}// 释放内存free(dynamicArray);return 0;
}
3.动态申请一个整型数组,并给每个元素赋值,要求删除第3个元素;
/*3.动态申请一个整型数组,并给每个元素赋值,要求删除第3个元素;*/#include <stdio.h>
#include <stdlib.h>int main()
{// 动态申请一个能存储5个整型数据的数组int *array = (int*)malloc(5 * sizeof(int));if (!array){puts("malloc failed!");return -1;}// 给数组的每个元素赋值for (int i = 0; i < 5; i++){array[i] = i + 1;}printf("原始数组:");for(int i = 0;i < 5;i++){printf("%3d",array[i]);}printf("\n");// 删除第3个元素(在C中数组索引从0开始)// 将第3个元素之后的所有元素向前移动一个位置for (int i = 2; i < 4; i++){array[i] = array[i + 1];}// 释放被移动过的元素原来的位置的内存//free(array + 2);printf("修改后的数组:");for(int i = 0;i < 4;i++){printf("%3d",array[i]);}printf("\n");// 释放数组其余部分的内存free(array);return 0;
}
4.动态申请一个整型数组,并给每个元素赋值,要求在第4个元素后插入100;
/*4.动态申请一个整型数组,并给每个元素赋值,要求在第4个元素后插入100;*/#include <stdio.h>
#include <stdlib.h>int main()
{// 动态申请一个能存储5个整型数据的数组int *array = (int*)malloc(5 * sizeof(int));if (!array){puts("malloc failed");return -1;}// 给数组的每个元素赋值并打印printf("原始数组是:");for (int i = 0; i < 5; i++){array[i] = i + 1;printf("%d",array[i]);}printf("\n");// 在第4个元素后插入100// 注意:在C中数组索引从0开始,所以第4个元素是索引为3的元素int *insert_pos = array + 3;*insert_pos = 100;// 打印数组printf("改变之后的数组:");for (int i = 0; i < 5; i++){printf("%d ", array[i]);}printf("\n");// 释放数组内存free(array);return 0;
}
思考题:
编写一个函数,实现 void *memmove(void *dest, const void *src, size_t n);的功能。
提示: 将形参dest,src 先强制类型转换为一个char* 类型,然后利用从后向前逐字节进行数据拷贝,最终返回dest 指针
#include <stdio.h>
#include <stdlib.h>void* mymemmove(void *dest,const void* src,size_t n)
{char *d = (char*)dest; //强制类型转换char *s = (char*)src;// 如果源地址在目标地址之前,并且源地址和目标地址之间的距离大于要复制的字节数if((s < d) && ((s + n) > d)){//从后往前复制,避免覆盖未复制的数据d += n - 1; //因为int是4个字节,在第四个元素插入的话是移动3个s += n - 1;while(n--){// *d-- = *s--; //使代码更简洁*d = *s;d--;s--;}}else{// 如果源地址在目标地址之后,或者源地址和目标地址之间的距离小于或等于要复制的字节数while(n--){*d = *s;d++;s++; }}return dest; // 返回指向目标地址的指针
}int main(int argc,char** argv)
{int a[6] = {1,7,3,8,2};mymemmove(a+3,a+2,4*sizeof(int)); //调用mymemmove函数,将a+2到a+5的元素移动到a+3的位置a[2] = 100;for(register int i = 0; i < 6; i++)printf("%5d",a[i]);printf("\n");return 0;
}