it-swarm-tr.com

"Dizi/pointer denkliği" için modern terim nedir?

Hemen okuyan herkes hakkında muhtemelen C ile ilgili şu üç önemli gerçeği biliyor:

  1. Bir ifadedeki bir dizinin isminden bahsettiğinizde, (çoğu zaman) dizinin ilk elemanına bir gösterici olarak değerlendirir.
  2. "Dizi aboneliği" operatörü [], diziler için olduğu gibi işaretçiler için de çalışır.
  3. Dizi gibi görünen bir işlev parametresi aslında bir işaretçi bildirir.

Bu üç gerçek, C'deki dizilim ve göstergenin ele alınması için kesinlikle çok önemlidir. Üç ayrı gerçek bile değildir; Onlar bir merkezi kavramın birbirine bağlı yönleridir. Bu kavramın doğru bir şekilde anlaşılması olmadan, oldukça basit bir C programlaması bile yapmak mümkün değildir.

Bugün sorum şu, basitçe Bu kavramın adı nedir?

Eski moda olduğumu düşünmüştüm, ama her zaman "C dizisindeki işaretçiler ile işaretçiler arasındaki denklik" veya kısaca "dizi/işaretçi denkliği" olarak adlandırdım. Ama ben bu kelimeleri neredeyse SO'da söyleyemediğini öğrendim; Onlar oldukça fazla tabu.

Bu soyut veya felsefi bir soru gibi görünebilir, bu yüzden daha somut bir şekilde çerçevelemek için, aradığım şey cümle içinde kullanabileceğim basit bir isim veya isim cümlesidir "Evet, _____ nedeniyle dizi aboneliği düşünülebilir. işaretçi aritmetiği için sözdizimsel şeker olarak ", cevaben, diyelim ki, bu soru .

(Ama lütfen şunu da not edin değilbu sorunun cevaplarını mı arıyorsunuz, yoksa '' Eşdeğerlik 'kelimesinde yanlış olan nedir?' 'Sorusunun cevaplarını.) Evet, biliyorum, bu dizileri hayal etmede öğrencileri yanlış yönlendirebilir. ve işaretçiler bir şekilde aynıdır. bu FAQ liste girişi .

38
Steve Summit
  1. "Dizi üyeliği" operatörü [], diziler için olduğu gibi işaretçiler için de çalışır.

Hayır, aslında sadece işaretçiler için çalışıyor. Bir ifadeye [] yazdığınızda, her zaman ilk öğeye bir işaretçi gelir. arr[i]*(arr + i) ile eşdeğer olması gerektiği için bunun gerçekleşmesi garanti edilir. Eski ikincisi için "sözdizimsel şeker" dir. 

  1. Dizi gibi görünen bir işlev parametresi aslında bir işaretçi bildirir.

Bu aslında "dizi ayarı" olarak adlandırılan özel bir durumdur, burada derleyici dizi türündeki bir işlev parametresinin bildirimini ilk elemana bir işaretçi olarak değiştirir. Gerekçe, kesinlikle ifadelerin "dizi çürümesi" ile uyumlu işlevler yapmaktır, ancak C standardı terimleri ayrı tutar.

Her iki durumda da, ifadeler ve işlev parametreleri, genellikle gayrı resmi olarak "dizi bozulması" olarak adlandırılır. Bazen bu sadece işlev parametreleri için değil ifadeler için kullanılır. Terimin tek ve tutarlı bir kullanımı olduğunu sanmıyorum. "Dizi bozunma", C standardı bu terimi hiçbir yerde kullanmasa da, bence en iyisidir.


("Denklik" teriminden hoşlanmıyorum, çünkü bir dizi bir göstergeye dönüşebilir, ancak tersi olmaz. Aslında, her zaman "diziler ve işaretçiler aynı şeydir" gibi şaşkın inançlarla başlayan sayısız yeni başlayanlar vardır. eşdeğer "tam olarak yardımcı olmuyor.)

26
Lundin

C standardı bunun için tek bir kelimeye sahip değil. Davranışı (1) 6.3.2.1p3'te tanımlarken "dönüşüm", 6.5.2.1p2'de davranış (2) tanımlanırken "eşdeğer", 6.7.6.3p7'de davranış (3) tanımlanırken "ayar" kelimesini kullanır.

Eski kafalıyım ve (1) 'in gerçekleştiği ifadelerden veya (3)' ün gerçekleştiği işlev bildirimlerinden bahsettiğinizde açıkça belirtilmesi koşuluyla bu "dizi/işaretçi denkliği" olarak adlandırmanın yanlış olduğunu düşünmüyorum. Bununla birlikte, "eşdeğerlik" ten hoşlanmayan insanlar için daha lezzetli bir terim belki de "göstericiden diziye dönüşüm" olur, çünkü bu en sık olduğu zaman insanları şaşırtır (1).

13
zwol

array decay terimini kullanmalıyım. Bu terim önerdiği şeylerle iyi gider. C standardı bu bağlamda söylemez ve evet, ilk gün onu standart içinde aramaya başladım terimini duydum ama bulamadım (Yani, terimi vb. Kimin oluşturduğuyla ilgili biraz kafa karıştırıcı). Ayrıca alternatif olarak"çoğu senaryo dizisinin göstergeye dönüştüğü için yazılabilir" ...- Hayır, bu tek bir isim değildir. Ancak bu, yanlış yorum yapılmasına izin vermez. Standardın kendisi "dönüşüm" diyor. 

Çoğu zaman bunu uzun yoldan söylemeye çalışıyorum ve sonra Word'ü ("dizi çürüyen") parantez içine koyuyorum. Aslında bahsetmediğim ve standartındönüşümü göstergesine 

9
coderredoc

"Dizi-işaretçi bozunması" nın makul bir kestirim olduğunu düşünüyorum, çünkü "bozunma" Tür dönüşümle ilgili yaygın bir jargon olduğundan, C SSS: Soru 6.12 'de emsalsiz

S: Dizi başvuruları işaretçilere bozulduğundan, eğer bir arr bir dizi ise, arr ve & arr arasındaki fark nedir?

Bunu içeren "çürüme" nin genişletilmiş bir teknik anlamı C++ 11: std::decay 'dan beri C++ Standart Kütüphanesi isimlendirmesine kabul edilmiştir.

5
Mike Kinghan

Bahsedilen üç konsepte tek bir isim verilmemiştir, ancak bence bunları herhangi bir tür “eşdeğerlik” olarak tanımlamanın en azından “modern” C'yi tarif ederken karşı-üretken olduğunu düşünüyorum. Dizi bozunumunun sonuçları genellikle işaretçiler gibi davranırken, C99, dizi bozunumuyla üretilen işaretçilerin, diğer yollarla elde edilen işaretçilerle aynı şekilde davranması gerekmediğini belirtir. Verilen:

char fetch_byte_at(void *p, int x) { return ((char*)p)[x]; }

struct {char arr[5][7];} s;
char test1(int x) { return s.arr[0][x]; }
char test2(int x) { return fetch_byte_at(&s, x); }

standart, s.arr[0]'da kullanılan test1 işaretçi değerinin, ((char*)(void*)s), fetch_byte_at'dan çağrıldığında kullanılan test2 işaretçi değerine eşit olmamasının hiçbir nedenini belirtmez. Bununla birlikte, eşzamanlı olarak, test2 öğesinin s [tüm baytları okuyabilmesi gerektiğini, s.arr[0][x] olduğunu söylerken x [en az 34] değerleriyle öngörülebilir şekilde çalışması gerektiğini belirtir. sadece x ile 6 arasındaki değerler için anlamlıdır.

Standarttaki hiçbir şey tek tek ilk iki puanınızla çelişmese de, ikisinin de tutması mümkün değildir. Bir dizi bozulmasının sonucu, dizinin ilk elemanına "sıradan" bir göstergeden başka bir şey olabilir ya da [] işlecini diziye uygulamak, onu bir işaretçiye uygulamaktan farklı semantik özelliklere sahiptir. # 1 ve # 2 'nin hangisinin C99 tarafından geçersiz kılındığı açık olmasa da, artık modern C de artık herhangi bir "eşdeğerlik" oluşturmuyorlar.

Geleneksel C ile "modern" C arasındaki bir ayrımı fark ederseniz, eskiyi kullanışlı kılan şeyler için terimler belirlemek yararlı olabilir. Ancak bu şeyler bahsettiğiniz noktaların ötesine geçer. Ne yazık ki, böyle şeyler için herhangi bir standart terim bilmiyorum ve ilgili kavramları artık desteklemediğinde bu terminolojiyi sağlamak için Standart'ı aramayacağım.

5
supercat

Herkese teşekkürler. Bu "cevabı" kullanarak insanların verdikleri cevapları ve onların değerlendirmelerini özetlemek için kullanıyorum, kimsenin beğenmemesini veya bir şeyleri beklemelerini beklemiyorum.

Bir çok insan bu soruyu ciddi düşüncelere kattı ve bunu takdir ediyorum. Ancak bu noktada sonuçlandırabileceğim tek şey, en azından bugün aklımda olan soruya bir cevap olmadığıdır.

Oldukça az sayıda kişi "dizi çürümesi" önerdi ve bu çok hoş bir atış, ama benim için işe yaramıyor. Çoğunlukla orijinal soruda listelenen 1. ve belki 3. gerçeğe atıfta bulunur, ancak gerçekte 2. gerçeği ifade etmez. "Evet, dizi bozulması nedeniyle, dizi aboneliği işaretçi aritmetiği için sözdizimsel şeker olarak düşünülebilir." (Ya da en azından, niyetimiz açık ve öğretici ise, söyleyemezsiniz.) "Evet, dizi çürümesi nedeniyle ve işaretçi aritmetiğinin tutarlı olması için tanımlandığı şekilde dizi aboneliği işaretçi aritmetiği için sözdizimsel şeker olarak düşünülebilir ", yani, tamamen farklı bir su ısıtıcısı.

Açıkça söylemememe rağmen, yaygın olarak kullanılan, yaygın, kabul edilen kullanımda bir terim arıyordum, ancak Standart'ta gerçekten kullanılan kelimeleri içermesine gerek yoktu. Ve hiç kimsenin böyle bir terim öksürmediği düşünülürse, herkesin belirli miktarda spekülasyon yapması ve "Peki ya ...?" Olduğu düşünülürse, ilgili üçlünün arkasındaki kavram için yaygın kullanımda tek bir terim olmadığı sonucuna varırım. Gerçekler. (Hariç tutulan "eşdeğerlik" dışında.)

Bazı cevaplayıcılar ve yorumcular bunu (tek bir cevap olmadığını) çeşitli şekillerde söylediler. Devam edeceğim ve Lundin'in cevabını bu temelde kabul edeceğim ve çünkü diğerleri bunu en çok sevmiş görünüyor.

Ben, ileriye doğru ilerleyerek "C'deki işaretçilerle işaretçiler arasındaki yazışmaları" kullanmayı deneyebilir ve bunun olup olmadığını görebilirim. Diziler ve işaretçiler, erkekler ve kadınlar kadar farklıdır ve aslında birbirinden oldukça uzaktır, ancak sık sık mektup alışverişi yaparlar. :-)

2
Steve Summit

Bu soyut veya felsefi bir soru gibi görünebilir, bu yüzden daha somut bir şekilde çerçevelemek için, aradığım şey basit bir isim veya isim cümlesidir. "Evet, _____ nedeniyle dizi aboneliği düşünülebilir. işaretçi aritmetik için sözdizimsel şeker ", bu sorunun cevabını diyelim.

Aradığınız Cümle "Evet, dizi aboneliğinin başlık altında işaretçi aritmetik olması nedeniyle, dizi aboneliği işaretçi aritmetik için sözdizimsel şeker olarak düşünülebilir."

Tabii ki, aptalca, çünkü dizi abone olmasının işaretçi aritmetiği için sözdizimsel şeker olduğunu söylemesinin nedeni tam olarak ne olduğudur, çünkü bunu söylediğiniz kişi ne olduğunu bilmediği sürece daha fazla açıklama gerektirmez. Dizi abone olma ',' işaretçi aritmetik 'veya' sözdizimsel şeker 'anlamına gelir. Bu derleyicinin ikisinin farkını bilmediği anlamına gelmez (bunun sonucu olarak elde ettiğiniz tüm sözdizimsel şekerden sorumlu olan kişi olduğu için).

Bu aynı soru, herhangi bir dilin bizim için yaptığı her şey hakkında, daha yüksek sayıda daha düşük seviye talimatlar kullanarak kendimiz için yapabileceğimiz ve bu nedenle yalnızca kullanılan sözdizimsel şeker miktarını değiştiren birden fazla terim kullanarak başvurabilecekleri için gündeme getirilebilir. Bütün mesele farklı gibi davranmak değil (her zaman yolundalar, ama mesele bu değil), fakat programlamayı kolaylaştırmak (sadece [] işlecini işaretçi aritmetik için sözdizimsel şeker olarak kullanmadan kod yazmayı düşünmek ve varoluş nedenini çabucak anlıyorsunuz - çünkü farklı , çünkü daha kolay yazmak, okumak ve yönetmek için değil).

(Ama lütfen bu sorunun cevaplarını veya "Eşdeğerlik" kelimesinde yanlış olan ne? "Sorusunun cevaplarını aramayacağımı unutmayın. Evet, öğrencilerin dizilerin ve işaretçilerin bir şekilde olduğunu hayal etmelerini yanlış yönlendirebilir. Aynı. Bu FAQ liste girişini yazarken aklımda bulundum.)

Sorunuz "Dizi aboneliğinin işaretçi aritmetik için sadece sözdizimsel şeker olduğu anlamında dizi işaretçi eşdeğerliği için modern bir terim nedir?"

Cevap:

  1. Bir dizini dizine almak için [] operatörünü kullanırken "Dizi aboneliği".
  2. Bir işaretçiyi ([] operatörünü kullanmak yerine) el ile hareket ettirdiğinizde "İşaretçi aritmetik" özelliği. Bu terimi [] operatörüne verdiğiniz değere göre yaptığınız her matematik için de kullanmak gibi hissedebilirsiniz, ancak orada gerçekten işaretçi aritmetik işlemi yapmıyorsunuz, bunun yerine, sözdizimsel terim olan "bir dizin hesaplıyorsunuz". bellekteki nesnelerin büyüklüğünün sizin için otomatik olarak hesaba katılması şekeri (yine farklı değildir, sadece yazması, okunması ve yönetilmesi daha kolaydır, böylece: sentaktik şeker).
1
pie

Bu ince bir soru. Bir İngilizce eş anlamlılar sözlüğüne ve sözlüğüne göz atarken, similitude teriminin bağlamınıza uygun olabileceğini bulmaya geldim.

Oxford'un Çevrimiçi Sözlük tanımı ile, Similar kelimesi şöyle tanımlanır:

görünüm, karakter veya nicelik olarak aynı olmadan benzerlik gösterir.

ve Similitude Word'ü şöyle:

bir şeye benzemenin niteliği veya durumu.

Diziler ve işaretçiler aynı olmadığından, bazen de aynı şekilde işlendiğinden, şunu söyleyebiliriz:

Evet, Array/Pointer similitude nedeniyle dizi aboneliği pointer aritmetiği için sözdizimsel şeker olarak düşünülebilir "

1
machine_1

"İşaretçi/dizi eşdeğeri" veya "dizi bozunma" (işaretçi içine) gibi terimlerin yanlış olduğunu ve çok yanıltıcı olabileceğini kabul ediyorum.

Aşağıdakileri öneriyorum:

Bir diziye erişim [] operatörünü kullanarak - ile bir dizin - eşdeğer bir işaretçi aritmetik ifadesi. Bununla birlikte, bir işaretçi ve bir dizi arasında denklik yoktur: Bir işaretleyicinin değerini (içeriğini) mutlu bir şekilde değiştirebilirim, belki ayrı bir yineleme sayacını kaydedebilirim, ancak bunu "çürütülmüş" diziyle yapamam; değişmez ve bazı açılardan C++ referanslarına benzer davranışlar sergiliyor.

Her iki fiil de "çürümeye" ve "dönüştürmeye" ingilizceyi her zaman aslının süreçte değiştirildiğini aktarır. Bir dizinin ismini kullanmak veya unary '&' işlecini kullanmak işlenenini değiştirmez.

Bu nedenle, "bir işaretçi verir" veya "bir işaretçi oluşturur" gibi bir ifade daha doğru olacaktır. Bu, her iki durumda da, sonuçtaki işaretçinin, CPU'nun bir GP kaydında oturan geçici bir şey olduğu gerçeğine yansıtılır. ve atanamaz.

En azından benim anlayışım bu, sökülmelere bakmak bunu doğrulıyor gibi görünüyor.

0
GermanNerd

Standart, dönüştürülmüş terimini kullanır. Dizi ve işaretçi denkliği işaretçiler üzerinde hala [array çürüme . Standard, bu terimden bahsetmiyor, sadece diziciler ve işaretçiler bağlamında, dizi ve işaretçi denkliği olarak düşünülen programcılar arasındaki karşılıklı bir anlayış. İşaretçi ve dizi denkliği ne anlama gelir: işaretçi aritmetik ve dizi indeksleme [ki] C, işaretçiler ve diziler farklıdır. .

0
haccks