C++'da, C cinsinden olduğu gibi, dizi türünde olduğu bildirilen bir parametre ayarlanmış (derleme zamanında) işaretçinin türüne, özellikle dizinin öğe türüne göre bir göstericidir.
Bu dizi türü doğrudan veya bir typedef yoluyla belirlenip belirlenmediğini olur (Typedef varolan türü için, sadece bir takma ad yeni bir tür oluşturmak olmadığını unutmayın).
Yani bu:
void f2(char* x, char* y)
{
// ...
}
da C ve C++ tarafından paylaşılan bir diğer kural, düzen tipinde ifadesi çoğunda ama hepsi değil, olmasıdır:
typedef char ar[];
typedef char* pr;
void f2(ar x, pr y)
{
// ...
}
gerçek anlamını Içerikler, örtülü olarak dönüştürülmüş dizi nesnesinin ilk öğeye bir işaretçi. Hangi bir dizi nesne tanımlarsak anlamına gelir:
char arr[10];
Eğer (sınırları bilgi kaybeder) bir char*
parametre alan bir fonksiyon için bir argüman olarak bu nesne adını kullanabilir. C
bu kapalı dönüştürme olmaz durumlar şunlardır: Dizi ifadesi sizeof
(sizeof arr
işlenen olan
- dizinin boyutu, bir büyüklüğü elde edilir Işaretçi); Dizi ifadesi tekli
&
işlenen olan
- (
&arr
, bir işaretçi-dizi bir işaretçi-pointer); ve
- dizi sentezleme düzen tipinde bir nesneyi hazırlamak için kullanılan tam bir dizisi (
char s[] = "hello";
bir işaretçi olarak, bir dizi olarak s
başlatır) 'dir.Bu durumlarda (veya C meydana Diğer durumlarda ++) ait
hiçbiri çağrı, böylece programda görünür:
f2(data,ptr);
f2
için tip
char*
iki işaretçi değerlerini geçirir.
f2
içinde, parametre x
ve y
tip char*
arasında her ikisi de nesneler, bu std::is_same<decltype(x), decltype(y)>::value
geçerlidir.
Ancak ar
ve pr
türleri farklıdır. ar
, eksik bir dizi türü char[]
ve pr
, işaretçi türü char*
'dur.
Programınızın çıktısını açıklar. Tuhaflık, ar
dizi türüyle tanımladığınız x
parametresi, pr
ile aynı tür olan char*
türünde olduğu için gerçekleşir.
Çürüyen? (fonksiyon parametreleri olarak) – dyp
(yorumumun ayrıntılandırılması :) Fonksiyonun parametre türleri [dcl.fct]/5'e göre "bozulur": "Her bir parametrenin tipini belirledikten sonra," dizisi "türünde herhangi bir parametre T '”veya“ T 'döndüren işlev”, “T” işaretçisi veya “T” işlevini döndüren işaretçi ”olarak ayarlanır. Bu nedenle 'decltype (x)' * 'char' *' ın * işaretçisidir, 'char' * 'un bilinmeyen bir dizi dizisi değildir (' ar'den farklı olarak). – dyp
@DyP Standart referans için teşekkürler, efendim. – WhozCraig