Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: отличие char* str ="..." от char ...[]="..."

Сообщения:  [1-6] 

 
 автор: AlexandrStep   (25.12.2008 в 15:08)   письмо автору
 
   для: bronenos   (25.12.2008 в 00:17)
 

Здраствуйте:) Доказывать не буду :) Так как не встречался с подобными проблемами :) А если и встречался то не делал их глобольными :)

  Ответить  
 
 автор: bronenos   (25.12.2008 в 00:17)   письмо автору
 
   для: exp   (24.12.2008 в 16:42)
 

delete для переменных, созданных new
delete[] для указателей, созданных new[]

  Ответить  
 
 автор: exp   (24.12.2008 в 16:42)   письмо автору
 
   для: AlexandrStep   (24.12.2008 в 13:43)
 

strcpy() и взаправду удобнее :)

насчёт [] или не [] , чем докажите?)
тут был аргумен в пользу []
, т.к. некоторые компиляторы могут ругаться если не [], а str = "..." у меня только работает если *str="..." :)

str[] ="" однозначно удобнее ;) её sizeof'ом хоть померить можно всё остальное похоже просто указатели
#include <iostream>
#include <malloc.h>
#include <conio.h>
using std::cout;

int main()
{
  char * str = new char[200];
  char * str4 = ( char * ) calloc( 200, sizeofchar ) );
  strcpy( str, "hello" );
  strcpy( str4, "hello" );
  cout << sizeof str << " " << sizeof *str << " " << sizeof &str 
<< " == str\n" << sizeof str4 << " " << sizeof *str4 << " " << sizeof &str4 << " == str4\n";

  char * str2 = "helloworld";
  cout << sizeof str2 << " " << sizeof *str2 << " " << sizeof &str2 << " == str2\n";
  char str3[] = "helloworld";
  cout << sizeof str3 << " " << sizeof *str3 << " " << sizeof &str3 << " == str3\n\n"

  << str2 << " " << str3 << "\n" << str4 << "== str4\n" << str << "== str\n\n";

free( str4 );
  cout << str4 << " == str4\n";

  delete str4;
  cout << str4 << "== str4\n";

  delete[] str;
  cout < < str << "== str\n";

  delete str;
  cout << str << "== str\n";

  getch();
  return 0;
}
а delete[] str; и delete str; очень похожи на одно и то-же
, даже одно и тоже после них извлекается из указателя

  Ответить  
 
 автор: AlexandrStep   (24.12.2008 в 13:43)   письмо автору
 
   для: StarWorm   (19.11.2008 в 23:04)
 

str="hello my dear world ! !!";//если я не ошибаюсь strcpy для строк инкто не отменял
strcpy(str,"hello my dear world ! !!");


также не работает delete [] str!
строка удаляется как delete str;

  Ответить  
 
 автор: bronenos   (26.11.2008 в 01:03)   письмо автору
 
   для: StarWorm   (19.11.2008 в 23:04)
 

Вроде так
Если что, гуру постарше меня поправят

char* str - str объявляется как указатель на массив из char элементов, и ему присваивается выделенный в памяти статический char массив, который поэтому нельзя изменять

char str[] - [] аналогично *, но при этом если помните, динамическое выделение происходит при помощи []. Видимо, из-за динамичности выделенной памяти и возможна такая манипуляция.

Я уже много пишу на Си, но честно говоря, никогда не думал о таком вопросе и всегда пользовался [], если надо было вогнать массив с неизменными значениями, и *, если надо просто объявить переменную как указатель.

  Ответить  
 
 автор: StarWorm   (19.11.2008 в 23:04)   письмо автору
 
 

Хочу узнать в чем заключается принципиальное отличие!
При написании такого кода:
#include "stdafx.h"
# include <stdio.h>
# include <conio.h>
# include <iostream>

using namespace std;

void clearStr(char* arrStr)
{
char* tmp;
int result;
while((tmp=strstr(arrStr,"  "))!=NULL)
{
result=(int)(tmp-arrStr+1);
while(arrStr[result]!=NULL)
{
arrStr[result++]=arrStr[result+1];
}
}
}

int main()
{
char* str = new char[200];
gets(str);
str="hello    my dear  world  !  !!";
char str1[]="hello    my dear  world  !  !!";
clearStr(str);
clearStr(str1);
cout<<str<<"\n"<<str1;

delete [] str;
getch();
return 0;
}


прога должна убирать "лишние" пробелы, не включая начальные и конечные! :)
В итоге если я заполняю char* str = "..." то при передаче в функцию я не могу ищменять символы, а также не работает delete [] str!
Если же я заполняю при помощи gets(str) ну или cin.getline(str,255) - то все нормально!
Ну а если я заполняю как char str[]="..." то тоже все пучком и ничто нигде не ругается!
Просто я уже оч. привык работать с указателями и запись вида 'typedef' vae[] для меня является дикой...

  Ответить  

Сообщения:  [1-6] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования