一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言泛型編程實例教程

C語言泛型編程實例教程

2021-02-01 12:34C語言程序設計 C/C++

這篇文章主要介紹了C語言泛型編程,針對泛型的用法做了深入淺出的實例介紹,是C程序設計中非常實用的技巧,需要的朋友可以參考下

本文實例講述了C語言泛型編程的方法,分享給大家供大家參考之用。具體分析如下:

首先,泛型編程讓你編寫完全一般化并可重復使用的算法,其效率與針對某特定數據類型而設計的算法相同。在C語言中,可以通過一些手段實現這樣的泛型編程。這里介紹一種方法——通過無類型指針void*

看下面的一個實現交換兩個元素內容的函數swap,以整型int為例:

?
1
2
3
4
5
6
void swap(int* i1,int* i2){
     int temp;
     temp = *i1;
     *i1 = *i2;
     *i2 = temp;
}

當你想交換兩個char類型時,你還得重寫一個參數類型為char的函數,是不是能用無類型的指針來作為參數呢?看如下改動:

?
1
2
3
4
5
void swap(void *vp1,void *vp2){
    void temp = *vp1;
    *vp1 = *vp2;
    *vp2 = temp;
}

但是這段代碼是錯誤的,是通不過編譯的。首先,變量是不能聲明為void無類型的。而你不知道調用此函數傳進的參數是什么類型的,無法確定一種類型的聲明。同時,不能將*用在無類型指針上,因為系統沒有此地址指向對象大小的信息。在編譯階段,編譯器無法得知傳入此函數參數的類型的。這里要想實現泛型的函數,需要在調用的地方傳入相關要交換的對象的地址空間大小size,同時利用在頭文件string.h中定義的memcpy()函數來實現。改動如下:

?
1
2
3
4
5
6
void swap(void *vp1,void *vp2,int size){
   char buffer[size];//注意此處gcc編譯器是允許這樣聲明的
   memcpy(buffer,vp1,size);
   memcpy(vp1,vp2,size);
   memcpy(vp2,buffer,size);
}

在調用這個函數時,可以像如下這樣調用(同樣適用于其它類型的x、y):

?
1
2
int x = 27,y = 2;
swap(&x,&y,sizeof(int));

下面看另一種功能的函數:

?
1
2
3
4
5
6
int lsearch(int key,int array[],int size){
   for(int i = 0;i < size; ++i)
         if(array[i] == key)
              return i;
   return -1;
}

此函數在數組array中查找key元素,找到后返回它的索引,找不到返回-1.如上,也可以實現泛型的函數:

?
1
2
3
4
5
6
7
8
void* lsearch(void* key, void *base, int n, int elemSize){
  for(int i = 0;i < n; ++i){
    void *elemAddr = (char *)base+i*elemSize;
    if(memcmp(key, elemAddr, elemSize) == 0)
      return elemAddr;
  }
  return NULL;
}

代碼第三行:將數組的首地址強制轉換為指向char類型的指針,是利用char類型大小為1字節的特性,使elemAddr指向此”泛型“數組的第i-1個元素的首地址。因為之前已經說過,此時你并不知道你傳入的是什么類型的數據,系統無法確定此數組一個元素有多長,跳向下個元素需要多少字節,所以強制轉換為指向char的指針,再加上參數傳入的元素大小信息和累加數i的乘積,即偏移地址,即可得此數組第i-1個元素的首地址。這樣使無論傳入的參數是指向什么類型的指針,都可以得到指向正確元素的指針,實現泛型編程。

函數memcmp()原型:int memcmp(void *dest,const void *src,int n),比較兩段長度為n首地址分別為dest、src的地址空間中的內容。

此函數在數組base中查找key元素,找到則返回它的地址信息,找不到則返回NULL。

如果使用函數指針,則可以實現其行為的泛型:

?
1
2
3
4
5
6
7
8
void *lsearch(void *key,void *base,int n,int elemSize,int(*cmpfn)(void*,void*,int)){
  for(int i = 0;i < n; ++i){
    void *elemAddr = (char *)base+i*elemSize;
    if(cmpfn(key,elemAddr,elemSize) == 0)
      return elemAddr;
  }
  return NULL;
}

再定義一個要調用的函數:

?
1
2
3
4
5
int intCmp(void* elem1,void* elem2){
    int* ip1 = elem1;
    int* ip2 = elem2;
    return *ip1-*ip2;
}

看如下調用:

?
1
2
3
4
5
6
7
8
int array[] = {1,2,3,4,5,6};
int size = 6;
int number = 3;
int *found = lsearch(&number,array,size,sizeof(int),intCmp);
if(found == NULL)
     printf("NO\n");
else
     printf("YES\n");

C語言也可以實現一定的泛型編程,但這樣是不安全的,系統對其只有有限的檢查。在編程時一定要多加細心。

相信本文所述對大家C程序設計的學習有一定的借鑒價值。

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 高清不卡免费一区二区三区 | 美女被视频网站看免费入口 | 2019男人天堂 | 国产91短视频 | 国产好痛疼轻点好爽的视频 | 99热久久这里只有精品6国产网 | 无人区在线观看免费观看 | 亚洲不卡视频在线 | 动漫美女强行被吸乳做羞羞事 | 国产卡一卡二卡3卡乱码免费 | 国产高清在线播放免费观看 | 天堂资源在线www中文 | 亚洲一级视频在线观看 | 亚洲 日韩 自拍 视频一区 | 美女的隐私无遮挡撒尿 | 亚洲 欧美 成人 | 99久久久无码国产精品 | 男生和女生艹逼 | 被教官揉了一晚上的奶小说 | 色综合视频在线 | 国产精品久久久久久久久久久威 | 视频大全在线观看网址 | spank日本网站脱裤子打屁股 | 男人天堂色男人 | 好大好爽好硬我要喷水了 | 日韩版码免费福利视频 | 奇米色88欧美一区二区 | 四虎论坛 | 亚欧成人中文字幕一区 | 2022天天干 | 国产精品成人一区二区1 | 97热在线| 天堂精品高清1区2区3区 | 欧美另类老女人 | 大学生宿舍飞机china free | 无人知晓小说姜璟免费阅读 | 国产精品福利在线观看秒播 | 国产重口老太伦 | videojapan日本孕交孕 | h黑寡妇一级毛片 | www.亚洲视频.com|