2015-07-08 6 views
-4

В чем разница между использованиемКакая разница между флоат * и плывут [п] в C/C++

float* f; 

и

float f[4]; 

Или они относились точно так же? Будет ли использование одного над другим потенциально вызывать проблемы с распределением памяти? Если нет, существуют ли какие-либо ситуации, когда с ними обращаются по-разному?

Не знаю, относится ли это, но я использую тип float * как аргумент функции. Например:

void myfun(float* f){ 
    f[0] = 0; 
    f[1] = 1; 
    f[2] = 2; 
    f[3] = 3; 
} 

, который собирает и работает нормально (я не совсем уверен, почему - я думаю, что, так как я не выделял какой-либо памяти f что бы бросить своего рода исключение).

+1

Просто посмотрите «массивы и указатели в C». – Jashaszun

+0

Эта статья может немного помочь: http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c – scrappedcola

+1

Имя массива IS является указателем на его первый элемент , 'float f [4]' будет выделять пространство в стеке, float * f определяет только неинициализированный указатель. Когда вы вызываете функцию, передающую массив, вы не передаете все данные, а только адрес данных, который уже выделен вызывающим. Поэтому функции не нужно выделять. –

ответ

3
float f[4] 

представляет собой массив, который выделяется с автоматическим хранением (обычно стек)

float* f; 

является указателем, который сам по себе не имеет никакого распределения, кроме размера указателя. Он может указывать на одно значение с плавающей запятой или массив поплавков, который был выделен либо автоматическим, либо динамическим хранилищем (куча)

Нераспределенный указатель обычно указывает на случайную память, поэтому, если вы передадите его в свою функцию myfun, вы получите неопределенное поведение. Иногда может показаться, что он работает (переписывая любую случайную память, на которую он указывает), и иногда это будет за исключением (попытка записи в недопустимую или недоступную память)

Во всех случаях они обрабатываются одинаково, а не в других. то есть sizeof(f) будет отличаться.

1
float* f; 

Это указатель на переменную с именем F типа поплавка

float f[4]; 

Он переменную массива с именем F типа поплавка с размером 4

В чем разница между использованием

float * f;

и

float f [4];

Или их обрабатывают точно так же? не

Нет

ли с помощью одного над другим потенциально причинить вам столкнуться с проблемами распределения памяти ?

Вы не должны использовать один вместо другого, вы можете столкнуться с несколькими проблемами не только с проблемами, связанными с памятью.

Если нет, существуют ли какие-либо ситуации, когда к ним относятся по-разному?

Они всегда обрабатывают иначе, за исключением того, что массив сценариев и декларации указателей взаимозаменяемы как функции формальных параметров.

, который собирает и работает нормально (я не совсем уверен, почему - я думаю , что, так как я не выделял какой-либо памяти F, что бы пролить некоторый вид исключения).

Этот сценарий объясняется выше как исключение в предыдущем ответе.

Читать arrays and pointers

1

«Я думаю, что, так как я не выделял какой-либо памяти, что е было бы бросить своего рода исключение).»

Нет, если вы не выделять память для f соответственно, разыменований просто неопределенного поведения. Никаких исключений не гарантировано.

Ваш холодильник может съесть вашу кошку в случае ...