Дякую за допомогу посиланнями на більш зрозуміліші українські статті.
Я прочитав, але тільки частину (поверхнево) і потрібні уточнення.
Після уточнень, прочитаю ще раз.
1. Чи правильно я зрозумів, що
*mas - це не змінна, як я думав раніше, а ім'я покажчика.
2. Не можна записувати так:
Правильно записувати так:
char* mas1, *mas2, *mas3;
Тобто, щоб показати компілятору що це не змінна, а ім'я покажчика, перед символьної комбінацією записується знак зірочки.
3. А чи діють ті самі правила в символьній комбінації для імен покажчиків, що і для змінних (не можуть починатися з цифри, мають містити тільки
qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_
) ?
4. Ім'я покажчика якимось дивним чином вказує на адресу в пам'яті.
При порівнянні 2-х імен покажчиків, порівнюються номера адрес в пам'яті.
Якщо один покажчик був створений раніше другого, то його адреса є меншою:
int *p, *p1;
if(p<p1) printf("p firstly\n");
else printf("p secondly\n");
5. Будь-яке ім'я покажчика можна порівняти з нулем (хоча 0-ва адреса стається резервована під біос, не бачу в цьому сенсу).
6. Сенс є, якщо покажчики визначають не адресу пам'яті фізичної, а адресу віртуальної - тої, що виділена даній програмі. Чи це так?
7. Як правильно казати - ім'я покажчика (символьна комбінація), чи покажчик (якийсь невідомий клас)?
8. Синонімами є запис:
char* mas="hello world!";
//mas[11]='.';//крапка замість знаку оклику
*(mas+11)='.';
*mas вказує на початок адреси пам'яті, де міститься його дані, а (*mas+11) - на той елемент пам'яті, де міститься 12-й елемент.
Питання:
1) чи це правильно? Чому мій компілятор на таке сильно лається?
2) А чи можна поміняти значення сусіднього масиву ось таким чином:
9. А чи можна якимось чином надрукувати саме адресу пам'яті, а не значення, що знаходяться в ній?
10. Де можна знайти нормальний асемблерний код цього покажчика, щоб не морочити собі голову?
▼візьми із компілятора
#include <stdio.h>
int main() {
float *p1[10]={0,};
*p1[2]=1.2f;
printf("p[2]=%.1f\n", &p1[2]);
return 0;
}
.file "main.cpp"
# GNU C++ (tdm64-1) version 4.9.2 (x86_64-w64-mingw32)
# compiled by GNU C version 4.9.2, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.2
# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
# options passed: -I C:/Program Files/Dev-Cpp/MinGW64/include
# -I C:/Program Files/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include
# -I C:/Program Files/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include
# -I C:/Program Files/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++
# -imultilib 32
# -iprefix C:/Program Files/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/
# -D_REENTRANT main.cpp -m32 -mtune=generic -march=x86-64
# -auxbase-strip main.o -fverbose-asm
# options enabled: -faggressive-loop-optimizations
# -fasynchronous-unwind-tables -fauto-inc-dec -fcommon
# -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining
# -feliminate-unused-debug-types -fexceptions -ffunction-cse -fgcse-lm
# -fgnu-runtime -fgnu-unique -fident -finline-atomics -fira-hoist-pressure
# -fira-share-save-slots -fira-share-spill-slots -fivopts
# -fkeep-inline-dllexport -fkeep-static-consts -fleading-underscore
# -fmath-errno -fmerge-debug-strings -fpeephole -fprefetch-loop-arrays
# -freg-struct-return -fsched-critical-path-heuristic
# -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
# -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
# -fsched-spec-insn-heuristic -fsched-stalled-insns-dep
# -fset-stack-executable -fshow-column -fsigned-zeros
# -fsplit-ivs-in-unroller -fstrict-volatile-bitfields -fsync-libcalls
# -ftrapping-math -ftree-coalesce-vars -ftree-cselim -ftree-forwprop
# -ftree-loop-if-convert -ftree-loop-im -ftree-loop-ivcanon
# -ftree-loop-optimize -ftree-parallelize-loops= -ftree-phiprop
# -ftree-reassoc -ftree-scev-cprop -funit-at-a-time -funwind-tables
# -fverbose-asm -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double
# -maccumulate-outgoing-args -malign-double -malign-stringops
# -mavx256-split-unaligned-load -mavx256-split-unaligned-store
# -mfancy-math-387 -mfp-ret-in-387 -mfxsr -mieee-fp -mlong-double-80 -mmmx
# -mms-bitfields -mno-red-zone -mno-sse4 -mpush-args -msahf -msse -msse2
# -mstack-arg-probe
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC1:
.ascii "p[2]=%.1f\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp #
movl %esp, %ebp #,
pushl %edi #
andl $-16, %esp #,
subl $64, %esp #,
call ___main #
leal 24(%esp), %edx #, tmp86
movl $0, %eax #, tmp87
movl $10, %ecx #, tmp88
movl %edx, %edi # tmp86, tmp86
rep stosl
movl 32(%esp), %edx # p1, D.2907
movl LC0, %eax #, tmp89
movl %eax, (%edx) # tmp89, *_1
leal 24(%esp), %eax #, tmp90
addl $8, %eax #, tmp91
movl %eax, 4(%esp) # tmp91,
movl $LC1, (%esp) #,
call _printf #
movl $0, %eax #, D.2908
movl -4(%ebp), %edi #,
leave
ret
.section .rdata,"dr"
.align 4
LC0:
.long 1067030938
.ident "GCC: (tdm64-1) 4.9.2"
.def _printf; .scl 2; .type 32; .endef
Потрібен "людський" код з коментарями.