void*任何資料型態的指標

(void*)印出16進制的位址

使用(void*)就可以印出16進制的位址

1
2
3
4
5
int main() {
  char c = 'a';
  cout << "變數c位址 = " << (void*)&c << endl;
  return 0;
}
變數c位址 = 0x7ff7bfeff46b

函式的參數為void*指標(位址)

函式的參數為void*指標,表示任何資料型態的指標(位址)都可以傳進函式,而且不需要轉型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//宣告printAddr的函式,參數資料型態為void*指標
void printAddr(void* p) {
  //印出位址
  cout << p << endl;
}
int main() {
  int i = 10;
  //將整數i變數的位址傳入
  printAddr(&i);
  char c = 'a';
  //將字元c變數的位址傳入
  printAddr(&c);
  double d = 150.222;
  //將浮點數d變數的位址傳入
  printAddr(&d);
  return 0;
}
執行結果
0x7ff7bfeff468
0x7ff7bfeff467
0x7ff7bfeff458

函式傳回值為void*指標

表示可以傳回任何資料型態的指標(位址),可以轉型成任何資料型態指標。

以下為malloc的傳回資料型態void指標(位址),void指標可以轉成任何資料型態指標,參數size_t __size代表設定空間大小。

1
void* malloc(size_t __size)

使用方式

在heap區段,建立10 byte的記憶體空間,將傳回的位址轉成char資料型態的指標。

1
char *name = (char *)malloc(10);//10byte

在heap區段,建立1mb的記憶體空間,將傳回的位址轉成int資料型態的指標。

1
int *num = (int *)malloc(1 * 1024 * 1024);//1byte*1024 = 1kb ->1kb*1024=1mb

不能對void*指標使用取值運算子*

不能對void*指標使用取值運算子*,需要轉換成其它資料型態的指標才可以使用取值運算子*

1
2
3
4
void printAddr(void* p) {
  //編譯失敗,不能對p指標使用取值運算子*,因為它是void*指標資料型態,必須轉型後才能對指標取出內容
  cout << *p << endl;
}
1
2
3
4
5
6
7
8
9
void printAddr(void* p) {
  //先將p指標轉型成char*指標,接著使用`取值運算子*`取出指標位址中的內容
  cout << *(char*)p << endl;
}
int main() {
  char c = 'a';
  printAddr(&c);
  return 0;
}
執行結果
a

函式的參數為void

函式的參數為void,代表不接受任何參數。

rand()產生亂數,以下為rand函式的定義,不接受任何參數,傳回int

1
int rand (void);

產生0-100的亂數

1
2
  int num = rand()%100;
  printf("rand = %d \n", num);

results matching ""

    No results matching ""