C tilidagi char massiv ko'rsatkichlariga murojaat qilish

Men ko'rsatgichga murojaat qilmaslik muammosiga duch keldim.

C tilida &a a ning manzilini bildiradi. Agar a ko'rsatgich bo'lsa, &a oddiygina ushbu ko'rsatgichning manzilini bildiradi.

Shunday qilib, agar bizda bo'lsa:

char ptr [] = "abcd"

ptr "a" bo'lgan birinchi belgiga ishora qiluvchi ko'rsatgich bo'lishi kerak. shuning uchun,

&ptr

"a" manzilidan farqli bo'lgan ptr manzili bo'lishi kerak. Biroq, quyidagi kodni sinab ko'rganimda, men juda aralashib qoldim:

int main()
{
    char a [] = "abcd";

    printf("0x%X 0x%X", a, &a);

}

Output: 0xBF7E62AB 0xBF7E62AB

Kimdir nima uchun a va &a bir xil qiymatga ega ekanligini tushuntira oladimi? Mening tushunishimga ko'ra, ular boshqacha bo'lishi kerak. oldindan rahmat


person turtlesoup    schedule 22.10.2013    source manba
comment
ptr ko'rsatgich emas. Bu massiv. Siz buni ayta olasiz, chunki kodingizda * yo'q, lekin katta yog'li [].   -  person Kerrek SB    schedule 23.10.2013
comment
a+1 va &a+1 qiymatlarini chop etishga harakat qiling va siz farqni ko'rasiz. web.torek.net/torek/c/pa.html savolingizga javob beradi juda yaxshi, BTW.   -  person Alok Singhal    schedule 23.10.2013
comment
@KerrekSB BEKIN MASSIV IZ FAQAT BIR KO'RSATMA BILAN BILAN ???   -  person    schedule 23.10.2013
comment
@H2CO3: Troll qilmang - bu o'lik sovg'adir. Haqiqiy pro hech qachon o'z taxminlarini shubha ostiga qo'ymaydi, lekin o'zini o'zi haqiqat deb qabul qiladi va keyin o'z xulosalariga mos kelmasligi uchun haqiqatni qattiq qoralaydi.   -  person Kerrek SB    schedule 23.10.2013
comment
@KerrekSB Umid qilamanki, bu kinoya edi. :) Haqiqiy professional hech qachon o'z fikrini so'ramaydi ... men bu xatti-harakatni necha marta ko'rganman ...   -  person    schedule 23.10.2013
comment
Masiv nomi C tilidagi ko'rsatkichmi? ning mumkin bo'lgan nusxasi   -  person n. 1.8e9-where's-my-share m.    schedule 23.10.2013


Javoblar (6)


Shunday qilib, agar bizda: char ptr [] = "abcd" bo'lsa, ptr birinchi belgiga ishora qiluvchi ko'rsatgich bo'lishi kerak.

Yo'q. Umuman emas

ptr massiv va massiv ko‘rsatkich emas.

Haqiqatan ham, agar siz ptr ni haqiqiy ko'rsatkich deb e'lon qilsangiz, siz kutilgan xatti-harakatni olasiz:

const char *ptr = "abcd";
printf("ptr = %p, &ptr = %p\n", (void *)ptr, (void *)&ptr);

Nima uchun massivning manzili uning birinchi elementining manzili bilan bir xil ekanligiga kelsak: bu juda mantiqiy. Massiv elementlarning ulashgan ketma-ketligini ifodalaydi. Massivning manzili massiv xotirada boshlanadigan joydir. Uning birinchi elementi boshlangan joydan boshlanadi. Shunday qilib, birinchi elementning manzili ("bo'lishi mumkin" -- standart bu xatti-harakatni talab qilmaydi) massivning o'zi manzili bilan bir xil.

+-----------+-----------+- - - -
| element 1 | element 2 |
+-----------+-----------+- - - -
^ start of array
^ start of first element
person Community    schedule 22.10.2013
comment
U erda bekor qilish kerakmi? - person detly; 23.10.2013
comment
@detly Ha, mutlaqo, aks holda bu aniqlanmagan xatti-harakatlar (%p ko'rsatgich bekor bo'lishini kutadi va qo'shimcha ravishda printf() variadikdir, shuning uchun odatda amalga oshiriladigan hech qanday yashirin konvertatsiya yo'q.) (amalda, bu gipssiz ishlaydi, ammo, va aslida, men kastingning ajoyib raqibiman, ayniqsa void * misolida, lekin afsuski, bu holat -- men biladigan yagona holat - bu majburiydir.) - person ; 23.10.2013

Kimdir nima uchun a va &a bir xil qiymatga ega ekanligini tushuntira oladimi? Mening tushunishimga ko'ra, ular boshqacha bo'lishi kerak.

Bayonotda

  printf("0x%X 0x%X", a, &a);  

a va &a har xil turdagi. a char * turida (emirilishdan keyin), &a esa char (*)[5] tipida.
a birinchi elementga ko'rsatgichga tushadi, shuning uchun a satrning birinchi elementining manzili. &a "abcd" qatorining manzili bo'lsa va u birinchi elementning manziliga teng.

person haccks    schedule 22.10.2013
comment
&a char ** turiga kirmaydi. U char (*)[5] turiga tegishli. - person ; 23.10.2013
comment
@H2CO3; Bu xato edi. - person haccks; 23.10.2013
comment
@kotlomoy; Hozir tahrirlangan. - person haccks; 23.10.2013
comment
@hacks Men bu tuyg'uni bilaman :) - person ; 23.10.2013

Massiv ko'rsatgich emas. To'g'ri siz &p ko'rsatgichning manzilini aytganingizda, agar p quyidagicha ta'riflangan bo'lsa:

char *p;

Massiv boshqacha va aynan bir xil harakatga ega emas.

Massivlar bilan:

char a[] = "abc";, &a[0] massivingizdagi birinchi elementning manzili, u a bilan bir xil.

person nouney    schedule 22.10.2013

char a[] = "abcd" a dan "abcd" gacha bo'lgan ko'rsatkichni emas, balki massivni e'lon qiladi. Agar massiv ko'rsatkichga o'tishi mumkin bo'lsa ham, u boshqa turdagi bo'lib, ular uchun &a va a bir xil manzilni beradi.

Asosan a massivning birinchi elementiga manzilni beradi, shuning uchun u &a ga (va &a[0] ga) ekvivalentdir.

person Jack    schedule 22.10.2013
comment
men printf(%x,*a) ni qila olaman va bu massivning birinchi elementi bo'lgan va ko'rsatkich bilan bir xil bo'lgan hexda "a" ni chop etadi. Shunday qilib, agar menga a kabi biror narsa berilgan bo'lsa, bu massiv yoki ko'rsatkich ekanligini aniqlashning hech qanday usuli yo'q, lekin ularning qaytish qiymatlari boshqacha? bu men uchun to'liq ma'noga ega emas. - person turtlesoup; 23.10.2013
comment
Buning sababi, massiv nomini printf ga o'tkazganda, u birinchi elementga ko'rsatgich uchun parchalanadi. Shuning uchun unga havolani bekor qilish sizga a beradi. Lekin bu massiv ko'rsatkich ekanligini anglatmaydi. - person haccks; 23.10.2013
comment
Aytaylik, men funktsiyani e'lon qilaman va ba'zi foydalanuvchi tasodifan ko'rsatgich o'rniga massivga o'tadi. Bunday holda, massiv va ko'rsatgichni ajratishning bir usuli bormi? Yoki seg xatosi yagona yechimmi? :\ - person turtlesoup; 23.10.2013
comment
@turtlesoup Seg xatosi qanday bog'liqligini ko'rmayapman. Massivni funktsiyaga o'tkazganingizdan so'ng, chaqirilgan funksiya siz massiv yoki ko'rsatkichni o'tkazganingizni aniqlay olmaydi. Farq faqat funktsiyaning tashqarida ko'rinadi. - person ; 23.10.2013
comment
@turtlesoup Agar siz massivni funktsiyaga o'tkazsangiz, u avtomatik ravishda massivning birinchi elementiga ko'rsatgichga aylantiriladi. - person This isn't my real name; 24.10.2013

Massivlar har doim xotirada saqlanadigan joyga havola qiladi, shuning uchun siz a ni chop qilganingizda, u joylashgan manzilni beradi, bu massivga (&a) ishora qiluvchi ko'rsatgichni olish bilan tengdir.

person MangO_O    schedule 22.10.2013

Xulq-atvoringizni olish uchun siz o'zgartirishga intilasiz

char a [] = "abcd";

to

char *a  = strdup("abcd");

yoki faqat o'qiladigan satr uchun

const char *a  = "abcd";

Keyin a va &a uchun boshqa manzilni olasiz.

Massivni funktsiyaga o'tkazishda massiv ko'rsatkichga aylanadi. Asl dasturingiz bilan sinab ko'ring

printf("%d %d\n",sizeof(a),sizof(&a));

Birinchisi satrning o'lchamiga qarab o'zgaradi, ikkinchisi mashinangizdagi ko'rsatgich o'lchamiga asoslanadi.

person Robert Jacobs    schedule 22.10.2013
comment
C da @H2CO3, satr harflari const char [] emas, char [] turiga ega, to'g'rimi? - person Alok Singhal; 23.10.2013
comment
@AlokSinghal Bu to'g'ri. Biroq, ularni o'zgartirish mumkin emas (ular const elementlardan iborat bo'lmaganiga qaramay) va satr literalidan char * ga o'tkazish bekor qilingan (hech bo'lmaganda clang va gcc ga ishonish mumkin bo'lsa). Shunday qilib, const ko'rsatkichidan foydalanib, satr harflariga ishora qilish yaxshi amaliyotdir. (C++ da ular bunga haqli va u yerda string literallari const char [] turiga ega.) - person ; 23.10.2013