我在一本書中找到了這段代碼,試圖解釋通用指標如何使用它來將一個矩陣復制到另一個矩陣。
#include <stdio.h>
#define FILAS 2
#define COLS 3
void copiarMatrices(void *, void *, int);
int main(){
int m1[FILAS][COLS] = {24, 30, 15, 45, 34, 7};
int m2[FILAS][COLS];
copiarMatrices(m2, m1, sizeof(m1));
for (int i = 0; i < FILAS; i ){
for (int j = 0; j < COLS; j ) printf("%d ", m2[i][j]);
printf("\n");
}
}
void copiarMatrices(void *dest, void *orig, int n){
char *destino = (char *)dest;
char *origen = (char *)orig;
for (int i = 0; i < n; i ) {
destino[i] = origen[i];
}
}
這本書說我們可以強制轉換 void 指標的唯一資料型別是 char 因為位元組大小不允許其他資料型別。
我不明白這一點,而且如果我在 void 指標上使用 int 或 double 資料型別執行程式,程式會卡住幾秒鐘,然后很好地完成。
uj5u.com熱心網友回復:
這本書所說的是“sizeof”運算子的結果是運算式引數的大小(以位元組為單位)。相反,如果您要指定“sizeof(m1) / sizeof(int)”,那么您需要將引數轉換為“int *”而不是“char *”,因為您將傳遞要復制的整數數量而不是位元組數。
uj5u.com熱心網友回復:
函式copiarMatrices復制任何大小的緩沖區。讓我們假設緩沖區orig是 5 個位元組。如果轉換為int *內部copiarMatrices和int4個位元組,我想所有5個位元組將復制orig到dest比n不會是整數(如果n = 1比4個位元組將被復制,如果n = 2比8個位元組將被復制,但我需要復制 5 個位元組)。因此,我們可以同意復制將以位元組為單位并n意味著將復制的位元組數。一般來說,你必須打電話copiarMatrices(m2, m1, FILAS * COLS * sizeof(int));
uj5u.com熱心網友回復:
您不需要任何特殊功能。你的功能copiarMatrices可以減少到memcpy(m2, m1, sizeof(m1));
一些評論。
- 不要
int用于尺寸。請改用正確的size_t型別。 - 努力做到
const正確。 - 回傳對目標物件的參考,它將允許在運算式中使用該函式。
你的函式原型應該是:void *copiarMatrices(void *, const void *, const size_t);。如果您想讓編譯器的生活更輕松,您可以:void *copiarMatrices(void restrict *, const void * restrict, const size_t);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362492.html
上一篇:指向指標C的指標
