通用指標類型

來源:互聯網
上載者:User

以下是通過指標傳遞參數給新線程傳遞參數方法:

這種方法首先將要傳遞的資料轉換成通用指標類型,然後傳遞給新線程,新線程再將其還原成原資料類型:
void *start_routine(void *arg);
int main(void) {
 int connfd;
 …
 pthread_create(&tid, NULL, start_routine, (void *)connfd);
 …
}
void *start_routine(void *arg) {
 int connfd;
 connfd =(int ) arg;
 …
}
這種方法雖然簡單,但卻有很大的局限性。如:要求arg的類型必須能被正確地轉換成通用指標類型,而且可傳遞的參數只有一個。

 

對下面的答案我並不滿意,還是沒懂。

因為對C語言並不精通,所以 對於轉換(void *)connfd有感覺納悶了,明明是整形,它轉化為通用指標到底變為什麼,有什麼作用呢?

void *指標只能儲存對象(也就是資料)指標。將函數指標轉換為void *指標是不可移植的。(在某些機器上,函數指標可能很大—–比任何資料指標都大。)但是,可以確保的是,所有的函數指標類型都可以相互轉換,只要在調用之前轉回了正確的類型即可。因此,可以使用任何函數類型(通常是int (*)()或void (*)(),即未指明參數、返回int或void的函數)作為通用函數指標。如果你需要一個既能容納對象指標又能容納函數指標的地方,可移植的解決方案是使用包含void *指標和通用函數指標(任何類型都可以)的聯合。

 

下面是自己寫的函數,希望能用VC調試看看,代碼如下:

#include <stdio.h>
int test(void *arg) {
 int connfd;
 connfd =(int ) arg;
 return connfd+1;
}
int main(void) {
 int connfd,a;
 connfd=5;
 a=test((void *)connfd);
 printf("%d",a);
}

輸出:6

 

#include <stdio.h>
int main(void) {
 int connfd;
 connfd=5;
 printf("%d",(void *)connfd);
}

輸出:5

 

目前還不知道怎麼理解,但暫時都將它看作:把整形換為指標型進行傳遞,(此時指標變數不是用來存放地址的)然後可以通過強制類型轉化再次變為整形。

 

 

void* 表指向的物件類型不確定。void * 可以和任何指標直接做變換,除了函數指標外。

如:

      int *pi;
       void *pv;
      pi=pv;   //注意在C++編譯器中必須轉換  pi=(int*)pv;
      pv=pi;

由於void * 可以和任何指標直接做變換,除了函數指標外,在C編譯器下,我們知道malloc函數的傳回型別是void*,所以下2句是等價的

  int *p =(int*)malloc(100*sizeof(int));

int *p =malloc(100*sizeof(int))

但是void* 不能做取值和小表操作

紅色部分內容轉自http://blog.csdn.net/yun_xy/archive/2005/10/14/503937.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.