C++ Въпроси

eddyy93

Registered
- Здравейте, искам да попитам как да преброя даден масив колко елемента има, примерно както е count(); във PHP, пробвах sizeof(array);, но не вади правелен резултат, как ще стане във C++;

- Как е правилно да укажа един масив във началото на програмата. Защото в момента трябва да напиша int m[10], като 10 са броя елементи ... аз може да не искам да имам ограничение на елементите, а ако махна това 10, тогава ми изкача грешка, а пък ако махна и скобите тогава ми излиза пак грешка. Други гледам, че ползват char m ... и т.н. тук възниква въпроса типа влиае на ключа на масива или на стойноста или на двете?

- Когато някой задава променлива или масив във началото защо слагат " * ", пример: char *masiv; , дали тази звездичка не ми отговаря на горния въпрос (ще тествам), ако не тогава какво указва?

- Какво е това int main() {}, защо отварям тази функция (незнам дали е функция, поне на това ми прилича), без нея разбира се не работи програмата, но защо ?
 
Така като гледам си начинаещ в C++, затова ще се старая да обясня нещата колкото мога по-просто, но това е доста обширна тема и няма да се впускам в много текст. Препоръчвам ти като допълнение да се разтърсиш в интернет.

Първо трябва да разбереш какво е указател. Указателите са променливи, които съдържат адреса на нещо в паметта. Както знаеш всяка променлива си има клетка в паметта с определен размер байтове.

Например имаш променливата int x = 2; Тя създава клетка с размер 4 байта (най-често). Тази клетка (поредица от байтове) си има адрес в паметта. Можеш да вземеш адреса на променливата x като напишеш &x. & преди име на променлива връща адреса и.

Така, вече като знаеш как се взима адрес на променлива трябва да можеш да го съхраниш някъде. За това се използват указателите.
Указател се дефинира така: int* ptrToX;
За да насочиш указателя към променливата x трябва да направиш това: ptrToX = &x;
Тоест присвояваш и адреса. Сега вече можеш да променяш x като напишеш това:
*ptrToX = 5;
Вече в x ще има 5. Звездичката преди указателя тук казва "Намери променливата, към която сочи указателя". Това е все същото като x = 5;

Повече информация за указателите - в интернет.

- Здравейте, искам да попитам как да преброя даден масив колко елемента има, примерно както е count(); във PHP, пробвах sizeof(array);, но не вади правелен резултат, как ще стане във C++;
Масивите всъщност са просто едни указатели към участъци в паметта. Като напишеш int arr[10]; реално типът на arr ще е int*, тоест указател към нещо от тип int. Като напишеш arr[2] = 2; всъщност казваш така: "Вземи началния адрес на масива от arr, прескочи 2 int-a и запиши 2 в третия int". Ако напишеш arr[200] = 2; -> "Вземи началния адрес на масива, прескочи 200 int-a и запиши 2 в 201вия int". Да, но в този случай просто няма да можеш да запишеш там, защото тази памет най-вероятно няма да е твоя.
Това, което се опитвам да кажа е, че дори C++ не знае колко е дълъг масива когато чете от него. Трябва ти сам да знаеш дължината на масива, когато го създаваш, и да си я записваш някъде.
За sizeof(arr): sizeof гледа само типа на променливата. Както казах по-горе типа е int* тоест sizeof(arr) == sizeof(int*) == обикновено 4 байта или 8 за 64битови машини. Няма значение колко е голям в масива.

- Как е правилно да укажа един масив във началото на програмата. Защото в момента трябва да напиша int m[10], като 10 са броя елементи ... аз може да не искам да имам ограничение на елементите, а ако махна това 10, тогава ми изкача грешка, а пък ако махна и скобите тогава ми излиза пак грешка.

C++ може да използва статична и динамична памет. Няма да се впускам в обяснения, че става много текст. Идеята е, че когато заделяш по този начин масива - дължината му трябва да е известна при компилация. Можеш например да заделиш масив с размер 200, пък да използваш само 20 елемента. Така имаш само горна граница на размера на масива. Има и друг начин за заделяне на масиви - с динамична памет, където това изискване го няма, но там ще ти е много оплетено за момента.

Други гледам, че ползват char m ... и т.н. тук възниква въпроса типа влиае на ключа на масива или на стойноста или на двете?
Разликата между char m[10]; и int m[10]; е в типа на стойностите в масива. Индексите винаги са числа. char е тип, който използва само 1 байт. Тоест число от -127 до 128

- Когато някой задава променлива или масив във началото защо слагат " * ", пример: char *masiv; , дали тази звездичка не ми отговаря на горния въпрос (ще тествам), ако не тогава какво указва?
Обясних го най-горе защо е.

- Какво е това int main() {}, защо отварям тази функция (незнам дали е функция, поне на това ми прилича) ?
Функция е - да. Компилатора трябва да знае кой код да се изпълнява при стартирането на програмата. Тоест от къде да започне. Тази функция се извиква при стартирането на програмата и се изпълнява кода в нея.
 
За да получиш броя на елементите в масива ползваш:
PHP:
sizeof(array)/sizeof(type);// където  type е int, char, long int, float, double, etc.
За направата на динамичен масив се ползва библиотеката вектор:
PHP:
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <conio>
using namespace std;
int main(){
vector<int> m;
for(int i=0;i<20;i++) m.push_back(rand%20+1); //Добавяш 20 елемента във вектора
m.push_back(23); // добавяш 21-ви елемент в масива
for(int i=0;i<m.size();i++) cout << m[i] << "\t";//извеждаш елементите на масива
cout << endl;
getch();
return 0;
}
 

Back
Горе