我看到一段代碼,上面寫著:
typedef struct dummy
{
int a;
int b[100] 。
} dummy_t;
typedef struct dummya
{
int a;
int b;
} dummya_t;
void * getptr(){
//回傳一個記憶體的指標。
}
void function(){
dummya_t*dstptr = getptr()。
dummy_t *srcpt = (dummy_t*)(dstptr-> b);
我可以看到dummy_t *srcpt = (dummy_t*)(dstptr->b);意思是作為一個指標指向另一個指標,但是,*srcpt應該是一個雙指標吧?像**srcpt
uj5u.com熱心網友回復:
你的代碼是不正確的,你不能使用指標來鑄造或分配不同型別的物件,例如:
struct a { int a, b; };
struct b { int a, b; };
是不同的物件,即使有相同的成員。
struct a x = {. a = 1, .b = 2 };
struct b *y = &x; // wrong
我可以看到dummy_t srcpt = (dummy_t)(dstptr->b); 意思是作為一個指標 指向另一個指標,但是*srcpt應該是一個雙倍指標,對嗎? 指標,對嗎?像**srcpt
你的假設是不正確的,一個基本的例子,使用普通指標到int:
#include <stdio.h>
int main(void)
{
int arr[] = {1, 2};
int *a = &arr[0] 。
int *b = &arr[1]。
printf("a = %d b = %d
", *a, *b)。)
int **ptr;
ptr = &a;
*ptr = &arr[1]。
ptr = &b;
*ptr = &arr[0]。
printf("a = %d b = %d
", *a, *b)。)
return 0。
}
輸出結果是:
a = 1 b = 2
a = 2 b = 1
正如你所看到的,當你想改變a或b(它所指向的地址)的內容時,你使用一個雙指標(**ptr),一個更有用的例子:
#include <stdio.h>
void swap(int **a, int **b)
{
int *temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
int arr[] = {1, 2};
int *a = &arr[0] 。
int *b = &arr[1]。
printf("a = %d b = %d
", *a, *b)。)
swap(&a, &b)。
printf("a = %d b = %d
", *a, *b)。)
return 0。
}
同樣的輸出:
a = 1 b = 2
a = 2 b = 1
uj5u.com熱心網友回復:
我可以看到
dummy_t *srcpt = (dummy_t*)(dstptr->b);意思是作為一個指標指向另一個指標,但是,*srcpt應該是一個雙指標吧?像**srcpt
不,這一行的意思是 "把dstptr->b的值當作dummy_t *型別的值,并把它分配給srcpt"。 它不是一個指向指標的指標。
運算式dstptr->b的型別是int,它不能直接分配給一個指標型別。 (dummy_t *)是一個cast,它告訴編譯器轉換這個型別。
就像 Vlad 在他的評論中所說的,這段代碼沒有任何意義。 它可能會被編譯,但僅僅因為它能被編譯并不意味著它是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315443.html
標籤:
下一篇:如何區分陣列指標和普通指標?
