De ce este char *A capabil să dețină șiruri de caractere, în timp ce char A nu poate? (Programare, C++, Pointeri, Char)

derry30 a intrebat.

Am probleme în a înțelege de ce un pointer de caractere este capabil să dețină un șir de caractere.

Nu ar trebui să fie ca și character, doar că ar trebui să fie capabil să dețină un caracter.

Comentarii

  • char* este un pointer către un caracter. char este un caracter. –  > Por 0x499602D2.
  • Un șir de caractere nu este un caracter. Un șir este o secvență de caractere. Întrebarea dumneavoastră nu are sens. –  > Por user207421.
  • @EJP: Un șir de caractere este o secvență de caractere, iar char* indică doar unul dintre ele (primul). Partea crucială este că secvența de caractere este terminată cu zero. Prin urmare, îl cunoașteți doar pe primul, dar puteți găsi toate caracterele următoare. (Iar cele două acțiuni sunt O(1) și O(N), deci cu siguranță distincte). +1 pentru că v-ați dat seama că lipsește ceva în modelul dvs. mental de șir de caractere și ați întrebat. –  > Por MSalters.
8 răspunsuri
SLaks

Se presupune că indicatorii de char-uri indică spre începutul unui șir de caractere.
Pointerul în sine indică primul caracter din șir, iar codul care utilizează pointerul presupune că restul șirului îl urmează în memorie, până când ajunge la un caracter de tip .

MSalters

Imagine:

+---+---+---+----+------
| A | B | C |  | ???
+---+---+---+----+------
  ^
  |---char*

Da, fiecare char* poate indica doar un singur caracter la un moment dat. Dar șirurile de caractere din C++, cum ar fi "ABC" sunt stocate în memorie ca o secvență contiguă, fără găuri și cu un caracter 0 la sfârșit. Prin urmare, dacă aveți pointerul la „A”, ++pointer vă va obține pointerul la „B”. De asemenea, știți că puteți face ++ până când găsiți ultimul ''. (Ceea ce este exact ceea ce strlen("ABC") face – utilizați ++ de 3 ori pentru a găsi 0, deci returnează 3.)

UnholySheep

un pointer de caractere nu ține nimic în afară de o adresă. această adresă este cea a primului element al unui array de caractere (sau poate fi cel puțin). în esență char* este același lucru cu char[]

Un char, pe de altă parte, este un tip de valoare și nu poate conține mai mult de un octet.

Nick L.

În C, șirurile de caractere (cu terminație nulă) sunt reprezentate în memorie în celule de memorie secvențiale de caractere (octeți ai acestora – dar nu am de gând să o fac mai complexă cu privire la alinierea octeților etc.), ultimul caracter secvențial fiind „” (de terminație):

char* str = "test"; -----> |t|e|s|t||

char tipul este despre un singur caracter:

char ch = 'a'; -----> |a|

Acum, în C++, puteți folosi fie șiruri de caractere în stil C (char* tipuri), fie string clasa din biblioteca standard.

Artur
char *a;

este un pointer(aka adresă/locație exprimată ca număr) către un caracter. Aceasta înseamnă că nu conține un șir (o secvență de caractere) în sine. De fapt char *a‘s size (în funcție de diverși factori) este de 4 octeți. O astfel de variabilă poate indica locația reală în care se află șirul de caractere (primul său caracter urmat de altele și terminat cu 0). În C/C++, aceasta va fi așa-numita ASCIIZ, adică o secvență de caractere terminată cu zero.

Dimpotrivă, aceasta:

char a;

este o variabilă (de obicei de 8 biți) care stochează doar unul caracter (un caracter ASCII simplu – nu un punct de cod Unicode etc.)

Actualizare:Bineînțeles că MSalters de mai jos are dreptate – șirul de caractere poate conține orice, adică poate fi compus din orice valoare pe care o poate conține char, iar aceasta nu trebuie (deși de obicei este) să fie interpretată ca ASCII.

Comentarii

  • probabil 4 octeți, probabil ASCII. Denumirea obișnuită este, prin urmare, NTBS, Null Terminated Byte String. –  > Por MSalters.
  • Într-adevăr, probabil de aceea am scris „(în funcție de diverși factori)” –  > Por Artur.
Plasmarob

este de fapt simplu:

char *A este un pointer de caractere. este un alt mod de a inițializa o matrice de caractere, ceea ce este un șir de caractere.

char A, pe de altă parte, este un singur caracter. nu poate fi mai mult de un caracter.

Consultați această conversație pentru mai multe informații:

http://www.cplusplus.com/forum/beginner/13343/

RealityPC

Gândiți-vă la șirul „abc” ca la o listă de Char „a”, „b” și „c”, Char A este o variabilă de tip Char, care nu poate reprezenta șirul „abc”. Char *A este un pointer de tip Char, poate indica o unitate Char variabilă de tip. Char *A poate fi utilizată pentru a indica primul element al șirului de caractere, în acest caz, „a”.

Saif Rahman

##char array sau char pointer nu reține șirul de caractere, ci doar indică adresa de bază##

A șir de caractere este o uniune de caractere stocate secvențial în locații de memorie. Prin urmare, dacă se cunoaște adresa de memorie a primului caracter, putem cunoaște celelalte adrese prin creșterea (cu mărimea corespunzătoare tipului de date. În acest caz, este vorba de 1 octet) a adresei de memorie.

Un șir de caractere este o matrice de caractere, iar numele unei matrice indică adresa de memorie unde este stocat primul caracter (Adresa de bază). Funcțiile de șir de caractere acționează prin manipularea acelei adrese de memorie (nu sunt sigur de acest lucru, dar nu mă pot gândi la o altă modalitate).

Pe de altă parte, un pointer char indică, de asemenea, locația de memorie a unui caracter.Astfel, poate fi utilizat în același mod de către funcțiile de șir de caractere.

Astfel, șirurile de caractere pot fi declarate folosind array-uri de caractere sau pointeri de caractere…