7.29 二维数组 malloc 外挂 实现库函数

数组与指针 :

数组在传递参数里,作用一样:  array 都是一个指针,接收数组的首地址

(int array[],int n  )

( int * array,   int n   )

指针和数组可以等价转换

array[i]     =========  *(array+i)

二维数组传参 :


(int a[][],  int R , int C)  //错误

横坐标可以不写,列坐标必须要写。

(int a[][6],  int R , int C)

  1. #include <stdio.h>
  2. #include <string.h>
  3. void init(int a[][6] ,int m, int n)
  4. {
  5. printf("%d\n",(int)sizeof(a)); //结果是4
  6. }
  7. int main()
  8. {
  9. int a[5][6];
  10. init(a,5,6);
  11. }

不同的指针+1的区别

int a [6] [4]

&a[0][0]  + 1             //  +了 4个字节

a[0]         + 1            //   +了 4个字节           a[0] 就从二维数组的概念转变成一维数组了

a              +1            //   +了 4*4个字节         a   应该从二维数组的角度

&a           + 1            //   +了 4*6*4个字节

   0    0    0

0    0    0    0

0    0    0    0

0    0    0    0

0    0    0    0

0    0    0    0

   0    0    0           0    0    0    0           0    0    0    0             0    0    0    0           0    0    0    0           0    0    0    0

随机输出扑克牌(不重复):

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #define M 4
  5. #define N 13
  6. int main()
  7. {
  8. char a[M][N] = {0};
  9. srand(time(NULL));
  10. int n,m,num;
  11. const char X[] = {‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘t‘,‘j‘,‘q‘,‘k‘};
  12. const char Y[] = {‘a‘,‘b‘,‘c‘,‘d‘};
  13. printf("请输入你现在还有几张牌:");
  14. scanf("%d",&num);
  15. while(num>0)
  16. {
  17. m = rand()%4;
  18. n = rand()%13;
  19. if(!a[m][n])
  20. {
  21. a[m][n] = 1;
  22. num--;
  23. printf("%c %c\n",Y[m],X[n]);
  24. }
  25. }
  26. return 0;
  27. }

malloc的使用 :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int n;
  6. printf("你的名字最多多长:");
  7. scanf("%d", &n);
  8. getchar(); //过滤回车
  9. char * a;
  10. a = (char *)malloc(n * sizeof(char));
  11. printf("请输入你的名字:");
  12. gets(a);
  13. printf("%s\n", a);
  14. free(a);
  15. }

realloc的使用 :


realloc(  指针   ,容量  );  //容量是改变后的大小,不是增加的大小

p = realloc(  p , 100)        //返回的地址, 是 现在100个的首地址  ,不是新增加的首地址

dll函数外挂 : 

_declspec(dllexport)   void   waigua()

{

}

_declspec(dllexport)是导出一个函数

交换字符串:

  1. #include <stdio.h>
  2. #include <string.h>
  3. char * str_reverse(char * str)
  4. {
  5. char temp;
  6. int len = strlen(str),i;
  7. for (i = 0; i < len/2; i++)
  8. {
  9. temp = str[i];
  10. str[i] = str[len-i-1];
  11. str[len-i-1] = temp;
  12. }
  13. return str;
  14. }
  15. int main()
  16. {
  17. char s[100] = "hello";
  18. char * p = str_reverse(s);
  19. printf("%s\n",p);
  20. }

字符串某个字符出现的次数:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int str_times(char * str,char ch)
  4. {
  5. int i = 0;
  6. while(*str != ‘\0‘)
  7. {
  8. if (*str == ch)
  9. i++;
  10. str++;
  11. }
  12. return i;
  13. }
  14. int main()
  15. {
  16. char s[100] = "hello";
  17. printf("%d\n",str_times( s , ‘l‘));
  18. }

strlen的实现 :

第一种实现方案:

  1. sizt_t strlen(const char *s)
  2. {
  3. size_t n = 0;
  4. while(*s++)
  5. n++;
  6. return n;
  7. }

第二种实现方案:

  1. sizt_t strlen(const char *s)
  2. {
  3. const char * p = s;
  4. while(*s)
  5. s++
  6. return s - p;
  7. }

自己写一个strlen 类似 mb_strlen 汉字只算一个字符

  1. #include <stdio.h>
  2. #include <string.h>
  3. int mb_strlen(const char * p)
  4. {
  5. int len = 0;
  6. while( *p )
  7. {
  8. len++;
  9. if(*p++ < 0)
  10. p++;
  11. }
  12. return len;
  13. }
  14. int main()
  15. {
  16. char *s = "a我b是c你d大e";
  17. int len = mb_strlen( s );
  18. printf("%d\n",len);
  19. return 0;
  20. }

strstr的实现:

  1. #include <stdio.h>
  2. #include <string.h>
  3. char * str_find(char * str, char * f)
  4. {
  5. while (*str)
  6. {
  7. char * a = str;
  8. char * b = f;
  9. char * res = NULL;
  10. if (*a == *b)
  11. {
  12. res = a;
  13. while (*++a == *++b ) ;
  14. if (*b == ‘\0‘)
  15. return res;
  16. }
  17. str++;
  18. }
  19. return NULL;
  20. }
  21. int main()
  22. {
  23. char *s = "helloworld";
  24. printf("%s\n",str_find(s ,"lo"));
  25. return 0;
  26. }

strcpy的实现:

  1. #include <stdio.h>
  2. #include <string.h>
  3. void str_cpy( char * dest , const char * src)
  4. {
  5. while(*dest++ = *src++);
  6. }
  7. int main()
  8. {
  9. char buf[100] = "aaaaaaaaaaaaaaaaaaaaaaaa";;
  10. str_cpy(buf , "liuwei");
  11. printf("%s\n" , buf);
  12. return 0;
  13. }

strcat的实现:

  1. #include <stdio.h>
  2. #include <string.h>
  3. char * str_cat(char *p,char *s)
  4. {
  5. char * bak = p;
  6. while(*p)
  7. {
  8. p++;
  9. }
  10. while(*p++ = *s++)
  11. {
  12. }
  13. return bak;
  14. }
  15. int main()
  16. {
  17. char s[10] = "hello";
  18. char v[10] = "world";
  19. printf("%s\n",str_cat(s,v));
  20. return 0;
  21. }

strtok的实现(不完善):

  1. #include <stdio.h>
  2. #include <string.h>
  3. char *str_tok(char * str, const char * de)
  4. {
  5. static char * n;
  6. char * r; //返回的首地址
  7. const char * de_bak = de; //分隔符地址备份
  8. if (str != NULL)
  9. n = str;
  10. r = n;
  11. while (*n)
  12. {
  13. while (*de)
  14. {
  15. if (*n == *de)
  16. {
  17. *n++ = ‘\0‘;
  18. return r;
  19. }
  20. de++;
  21. }
  22. de = de_bak;
  23. n++;
  24. }
  25. if (r == n)
  26. {
  27. return NULL;
  28. }
  29. return r;
  30. }
  31. int main()
  32. {
  33. char s[] = "abcd,cdef,efgh,ghjk";
  34. char *de = ",c";
  35. printf("%s\n", str_tok(s, de));
  36. char *p;
  37. while (p = str_tok(NULL, de))
  38. printf("%s\n", p);
  39. return 0;
  40. }

来自为知笔记(Wiz)

时间: 2024-10-19 19:08:17

7.29 二维数组 malloc 外挂 实现库函数的相关文章

用malloc开辟一个二维数组

#include <stdio.h> #include <stdlib.h> int main() { int **p; int i; int j; int row,coloum; printf("请输入你所要申请的二维数组的行和列:"); scanf("%d%d",&row,&coloum); p=(int**)malloc(sizeof(int*)*row); for(i=0;i<row;i++) { p[i]=(i

二级指针与二维数组

最近看<Linux C程序设计大全>这本书,虽然书中有一些错误,但整体来说,书写得还算可以. 当看到网络编程[第23.2.4小节 获得主机信息]时,遇到了一段代码,原文如下: “一台主机有许多和网络相关的信息,例如,主机名称.IP地址.主机提供的服务等.这些信息一般都保存在系统中的某个文件里(例如/etc/hosts等),用户程序可以通过系统提供的函数读取这些文件上的内容.Linux环境下使用gethostent函数读取和主机有关的信息,该函数的原型如下: 1 #include <net

关于返回二维数组指针问题

所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址. 二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址).行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a[5][5]:则a[0][0]是a数组 首行首列元素(代表该元素的值).而&a[0][0]是首行首元素的地址.&&a[0][0]则是首行的首地址.从这个意义上讲,可以说行的首地址是一种二重地址,即指针的指针. 废

c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

1 //题目:找出一个二维数组的"鞍点",即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. 2 // 3 #include "stdio.h" 4 #include <stdlib.h> 5 int main() 6 { 7 int i,j,k,hang=1,lie=1; 8 printf("输入行"); 9 scanf("%d",&hang); 10 printf("输入列"

二维数组转化成一维指针

二维数组转化为一维指针来使用本实例用到了随机数,链表生成,遍历,有待扩展 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<math.h> 5 //定义个结构体Emp用来存放员工信息 6 typedef struct Emp 7 { 8 int eno; 9 char *ename; 10 int dno; 11 Emp *next; 12 13 }emp,*pemp

【C语言】构造长度可变的二维数组

1 #include <stdio.h> 2 #include <malloc.h> 3 #include <memory.h> 4 5 int getArray(int ***p,int m,int n)//构造一个m*n维数组,并清零 6 { 7 int i; 8 *p=(int **)malloc(sizeof(int*)*m); 9 memset(*p,0,sizeof(int*)*m); 10 if(NULL==p) 11 { 12 printf("

0709 C语言常见误区----------二维数组做参数

总结: 1.二维数组名是指向一位数组的指针,本例中,其类型为 int (*)[4],在传递的过程中丢失了第一维的信息,因此需要将第一维的信息传递给调用函数. 关于二维数组名代表的类型,可通过下面的例子看出. 1 /************************************************************************* 2 > File Name: test_2arr.c 3 > Author:Monica 4 > Mail:[email prot

二维数组 cudaMallocPitch() 和三维数组 cudaMalloc3D() 的使用

? 使用  cudaMallocPitch()  和配套的  cudaMemcpy2D()  来使用二维数组.C 中二维数组内存分配是转化为一维数组,连贯紧凑,每次访问数组中的元素都必须从数组首元素开始遍历:而 cuda 中这样分配的二维数组内存保证了数组每一行首元素的地址值都按照 256 或 512 的倍数对齐,提高访问效率,但使得每行末尾元素与下一行首元素地址可能不连贯,使用指针寻址时要注意考虑尾部. 1 // cuda_rumtime_api.h 2 extern __host__ cud

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体