第四天!!!!! —————————————————————————————————————————— 今天我们来学C语言的灵魂——指针,认真学别眨眼哦! 学习内容: 1.指针即地址 当变量被定义时,为了能够准确的访问这些数据,他们都被编上了编号,也就是地址 (可以这样想,定义变量就像建造房子,为了能让人准确找到房子, 当然你就需要一个牌子——地址,让人准确地找到房子!) 2.指针的定义 C语言中有一种变量,可以用它来存放指针,这种变量成为指针变量。整型变量 用来存储整型,浮点型变量用来存储浮点型数据,那么很好理解,指针变量用来 存储地址。 3.内存申请(这个我不会,并且暂时也没有用到过) C语言中,利用函数 malloc 来申请内存,传入参数为申请内存的字节数,返回值为申请到 的内存的首地址,是什么类型的地址,就要强转成什么类型。 ?? ?看代码直接懂: ?? ?int *p=(int *)malloc(1024); ? ? ? ? p ?代表的是申请到的内存,并且有效内存字节数为 1024. ? ? ? ? 如果我们要申请一个长度为 n ?的 ?整型数组的内存,可以这么写: ?? ?int *p=(int *)malloc(sizeof(int)*n);//左边第一个*是指针的符号,后面的是乘号 ———————————————————————————————————————— 接下来,用题目带一下知识点吧! 1.力扣 1470.重新排列数组 #include<stdio.h> #include<stdlib.h>//用malloc函数需要写的头文件 int *shuffle(int *nums,int numsSize,int n,int *returnSize) { ?? ?int i,j; ?? ?int *ret=(int *)malloc(sizeof(int)*numsSize);//申请一个和nums数组一样大的内存空间 ?? ?for(i=0,j=0;i<numsSize,j<n;i+=2,j++) ?? ?{ ?? ??? ?ret[i]=nums[j]; ?? ?} ? ? ?? ?for(i=1,j=n;i<numsSize,j<numsSize;i+=2,j++) ? ??? ? { ? ? ? ? ?? ?ret[i]=nums[j]; ? ??? ? }? ? ? ?? ?*returnSize=numsSize; ?? ?return ret; } int main() { ?? ?int n; ?? ?int nums[10]={1,3,5,7,9,2,4,6,8,10}; ?? ?int numsSize=10; ?? ?int *p = shuffle(nums,numsSize,numsSize/2,&n);//定义一个指针来存放返回数组的首地址,遍历输出数组元素即可!!!! ?? ?for(int i=0;i<n;i++) ?? ?{ ?? ??? ?printf("%d ",*(p+i)); ?? ?} ?? ? } 2.力扣 1929.数组串联 int* getConcatenation(int* nums, int numsSize, int* returnSize){ ? ? int i; ? ? int *ret = (int *)malloc(2*numsSize*sizeof(int)); // (1) ? ? for(i = 0; i < numsSize; ++i) { ? ? ? ? ret[i+numsSize] = ret[i] = nums[i]; ? ? ? ? ? // (2) ? ? } ? ? *returnSize = 2 * numsSize; ? ? ? ? ? ? ? ? ? ? ? // (3)? ? ? return ret; } 3.力扣 1929.基于排列构建数组 int* buildArray(int* nums, int numsSize, int* returnSize){ ? ? int i; ? ? int *ret = (int *)malloc( sizeof(int) * numsSize ); ? ? for(i = 0; i < numsSize; ++i) { ? ? ? ? ret[i] = ?nums[ ?nums[i] ]; ? ? ? ? ? // (1) ? ? } ? ? *returnSize = numsSize; ? ? return ret; } 4.力扣 1480. 一维数组的动态和 int* runningSum(int* nums, int numsSize, int* returnSize){ ? ? int i; ? ? int *ret = (int *)malloc( numsSize * sizeof(int) ); ? ? for(i = 0; i < numsSize; ++i) { ? ?// (1) ? ? ? ? ret[i] = nums[i]; ? ? ? ? if(i) { ? ? ? ? ? ? ret[i] += ret[i-1]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? } ? ? *returnSize = numsSize; ? ? return ret; } 5.力扣 剑指 Offer 58 - II. 左旋转字符串 #include<stdio.h> #include<stdlib.h> #include<string.h> char *reverseLeftWords(char *s,int k) { ?? ?int i,j; ?? ?int l=strlen(s); ?? ?char *ret=(char *)malloc((l+1)*sizeof(char)); ?? ?for(i=k,j=0;i<l;i++,j++) ?? ?{ ?? ??? ?ret[j]=s[i]; ?? ?} ?? ?for(i=0;i<k;i++) ?? ?{ ?? ??? ?ret[j++]=s[i]; ?? ?} ?? ?ret[l]='\0';//!!!! ?? ?return ret; } int main() { ?? ?char s[]={"abcdefg"}; ?? ?int k; ?? ?scanf("%d",&k); ?? ?char *p=reverseLeftWords(s,k); ?? ?puts(p); }
优解: char* reverseLeftWords(char* s, int k){ ? ? int i; ? ? int n = strlen(s); ? ? char *ret = (char *)malloc( (n + 1) * sizeof(char) ); ? ?// (1) ? ? for(i = 0; i < n; ++i) { ? ? ? ? ret[i] = s[(i + k) % n]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 这样就可以一下子赋值 ? ? } ? ? ret[n] = '\0'; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // (3) ? ? return ret; }
6.力扣 1108.IP地址无效化 char * defangIPaddr(char * address){ ? ? char *ret = (char *)malloc(1000 * sizeof(char)); ? // (1) ? ? int returnSize = 0; ? ? int i; ? ? for(i = 0; address[i]; ++i) { ? ? ? ? ? ? ? ? ? ? ?// (2) ? ? ? ? if(address[i] == '.') { ? ? ? ? ? ? ret[ returnSize++ ] = '['; ? ? ? ? ? ? ret[ returnSize++ ] = '.'; ? ? ? ? ? ? ret[ returnSize++ ] = ']'; ? ? ? ? }else { ? ? ? ? ? ? ret[ returnSize++ ] = address[i]; ? ? ? ? } ? ? } ? ? ret[ returnSize ] = '\0'; ? ? ? ? ? ? ? ? ? ? ? ? ?// (3) ? ? return ret; } 7.力扣 剑指 Offer 05. 替换空格 char* replaceSpace(char* s){ ? ? char *ret = malloc( sizeof(char) * 30001 ); // (1) ? ? int i, retSize = 0; ? ? for(i = 0; s[i]; ++i) { ? ? ? ? if(s[i] == ' ') { ? ? ? ? ? ? ret[retSize++] = '%%'; ? ? ? ? ? ? ret[retSize++] = '2'; ? ? ? ? ? ? ret[retSize++] = '0'; ? ? ? ? }else { ? ? ? ? ? ? ret[retSize++] = s[i]; ? ? ? ? } ? ? } ? ? ret[retSize] = '\0'; ? ? return ret; } 8.力扣 1365. 有多少小于当前数字的数字 int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){ ? ? int *ret = (int *)malloc(numsSize * sizeof(int)); ? ? int i, j; ? ? for(i = 0; i < numsSize; ++i) { ? ? ? ? ret[i] = 0; ? ? ? ? ? ? ? ? ? ? ?// (1) ? ? ? ? for(j = 0; j < numsSize; ++j) { ?? ? ? ? ? ? ? if(nums[j] < nums[i]) { ? ? ?// (2) ? ? ? ? ? ? ? ? ++ret[i]; ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? *returnSize = numsSize; ? ? return ret; } 9.力扣 剑指 Offer 17. 打印从1到最大的n位数 int* printNumbers(int n, int* returnSize){ ? ? int i; ? ? int f = 1; ? ? int *ret;
? ? for(i = 0; i < n; ++i) { ? ? ? ? f *= 10; ? ? } ? ? --f; ? ? *returnSize = f; ? ? ? ? ? ? ? ? ? ? ? ?// (1) ? ? ret = (int *)malloc( f * sizeof(int) ); ? ? for(i = 1; i <= f; ++i) { ? ? ? ? ret[i-1] = i; ? ? ? ? ? ? ? ? ? ? ? // (2) ? ? } ? ? return ret; } 10.按既定顺序创建目标数组(这题没时间搞了!!!) int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){ ? ? int len = 0; ? ? int i, j, ins, idx; ? ? int *ret = (int *) malloc( ?sizeof(int) * numsSize ); ? ? for(i = 0; i < numsSize; ++i) { ? ? ? ? idx = index[i]; ? ? ? ? ins = nums[i]; ? ? ? ? for(j = len; j > idx; --j) { ?// (1) ? ? ? ? ? ? ret[j] = ret[j-1]; ? ? ? ? } ? ? ? ? ret[idx] = ins; ? ? ? ? ? ? ? // (2) ? ? ? ? ++len; ? ? ? ? ? ? ? ? ? ? ? ?// (3) ? ? } ? ? *returnSize = len; ? ? return ret; } —————————————————————————————————————————————————— 总结:写的有些匆忙,都23:32啦,刚刚完成!
?
|