linux下C程式設計(六)之 void用法大總結
阿新 • • 發佈:2019-02-11
這次對void差不多有點多少的理解了,從最初的理解就是空,麼有的意思。首先void是C語言中的關鍵字,對函式返回值的限定,對函式引數的限定。
但是這並不意味著,void *可以無需強制型別轉換的賦值給其他指標。
2.void 修飾返回值和引數列表
(1)如果函式沒有返回值,則應該顯式地宣告為 void。如果函式沒有 返回值,則預設為返回什麼?是不是 void?
上面的這段程式碼只會出現警告,但是編譯器還是會乖乖的聽話,幫你執行了。預設int型別
(2)如果函式無引數,則應該宣告其引數列表為 void。
void a; //錯誤,編譯器無法知道分配給 a 多大的空間。
p++;//錯誤,編譯器無法知道每次前進的大小。
其實對上面的這個我在linux下的gcc中調式了,可以執行出來,沒有在windows下調式,我也不知道對不對。因為環境和編譯器不一樣,那麼執行的結果也會不一樣。
在linux下的測試程式碼:
通過上面的程式碼。可以測試出void*p,p++地址會加1,,而對於int *q,q++那麼地址會加4,float也是如此,對於他們三個開闢的空間的地址起始還不一樣。之後還測試出,可能linux下人家的gcc太高階,編譯器太好了,人家對於未初始化的指標直接放到保留區,直接為NULL,在windows下這可就不一樣了。
5.void 關鍵應用最廣泛的領域:C 語言的泛型程式設計。
必須記得每次malloc完之後一定要free,否則會出現記憶體洩漏
1.void*常常被稱為空指標,其實理解為指向任意型別的指標比較合適,as we all kown,如果指標p1和指標p2的型別相同,那麼才可以相互賦值,型別不同的話,有必要在此之間進行強制型別轉化。而任意型別的指標都可以直接賦值給void*。
int *p1;
float *p2;
void *p3;
p1 = p2; //報錯,型別不匹配。
p1 = (int *)p2; //需要強制轉換
p3 = p2; //可以直接賦值
但是這並不意味著,void *可以無需強制型別轉換的賦值給其他指標。
void *p1; float *p2; p2 = p1; //錯誤 p2 = (float *)p1; //強轉後正確
2.void 修飾返回值和引數列表
(1)如果函式沒有返回值,則應該顯式地宣告為 void。如果函式沒有 返回值,則預設為返回什麼?是不是 void?
add(int a, int b)
{
return a + b;
}
int main(int argc, char **argv)
{
printf("2 + 3 = %d\n", add(2, 3));
}
上面的這段程式碼只會出現警告,但是編譯器還是會乖乖的聽話,幫你執行了。預設int型別
(2)如果函式無引數,則應該宣告其引數列表為 void。
3. void 不能真實的表達一個變數。
4.void*指標不能進行算術操作。(ANSI C 規定)
void *p;p++;//錯誤,編譯器無法知道每次前進的大小。
其實對上面的這個我在linux下的gcc中調式了,可以執行出來,沒有在windows下調式,我也不知道對不對。因為環境和編譯器不一樣,那麼執行的結果也會不一樣。
在linux下的測試程式碼:
#include <stdio.h> int main(int argc,char *argv[]) { void *p; int *q; float *m; printf("before q = %p\n",q); q++; printf("after q = %p\n",q); printf("before p=%p\n",p); p++; printf("after p = %p\n",p); printf("before m=%p\n",m); m++; printf("after m = %p\n",m); return 0; }
通過上面的程式碼。可以測試出void*p,p++地址會加1,,而對於int *q,q++那麼地址會加4,float也是如此,對於他們三個開闢的空間的地址起始還不一樣。之後還測試出,可能linux下人家的gcc太高階,編譯器太好了,人家對於未初始化的指標直接放到保留區,直接為NULL,在windows下這可就不一樣了。
before q = (nil)
after q = 0x4
before p=0x7ffff93fd5a0
after p = 0x7ffff93fd5a1
before m = 0x400440
after m = 0x400444
5.void 關鍵應用最廣泛的領域:C 語言的泛型程式設計。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void my_swap(void *a,void *b,int lenth)
{
void *p =malloc(lenth);
memcpy(p,a,lenth);
memcpy(a,b,lenth);
memcpy(b,p,lenth);
free(p);
}
int main(int argc,char *argv[])
{
int a = 10;
int b = 20;
double c = 100.123;
double d = 200.789;
printf("before a = %d,b = %d\n",a,b);
my_swap(&a,&b,sizeof(int));
printf("after a = %d,b = %d\n",a,b);
printf("before c = %lf,d = %lf\n",c,d);
my_swap(&c,&d,sizeof(double));
printf("after c = %lf,d = %lf\n",c,d);
return 0;
}
必須記得每次malloc完之後一定要free,否則會出現記憶體洩漏