скрытое меню

передача УКАЗАТЕЛЯ на строку в функцию

Можно ли передать в функцию УКАЗАТЕЛЬ на строку и потом там эту строку менять?

Да можно , если правильно понимать , что на самом деле происходит.
Ниже простой пример , когда в функцию bbb передается указатель на строку (char *). Потом в функции указателю меняют значение (адрес куда он указывает) на адрес другой строки. Сама исходная строка не изменится и останется в памяти как есть. В результате теряется указатель на первоначальное значение строки , т.е. далее в коде программы никак на первоначальную строку не сослаться. Если конечно не сохранить указатель на первоначальную строку отдельно в какой-то переменной(p).

void bbb(char *buf) 
{
    buf="changed";
    printf("buf=%s  %p \n",buf,buf);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    char buf[] ="1234567";
    char *p=buf;
    printf("buf=%s  %p \n",buf,buf);
    bbb(buf);
    bbb(&buf[0]);
    printf("p=%s  %p \n",p,p);

    return 0;

Вывод:

buf=1234567  0028FF0C 
buf=changed  0040D0D7   // видно , что указателю buf изменили значение(адрес) на новую строку "changed"
buf=changed  0040D0D7   // но почему во втором вызове функции адресс остается тот же? 
//Значит память под новую строку уже не выделяется, а использется старая память выделенная из первого вызова функции
p=1234567  0028FF0C 

sprintf

Кстати если в bbb сразу сделать так :
sprintf(buf,"changed...............");
произойдет сбой т.к. sprintf тупо копирует новое значение "changed..............." поверх старого "1234567", а новое значение длиннее старого и получается ....

используем new char[..]

void bbb(char *buf,int i)
{
    printf("--------bbb-------\n");
    buf=new char[20];
    sprintf(buf,"changed_%i..........",i*9);
    printf("buf=%s  %p \n",buf,buf);

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    char buf[] ="1234567";
    char *oldPointer=buf;
    printf("buf=%s  %p \n",buf,buf);
    int z=1;
    bbb(buf,z++);
    bbb(buf,z++);
    printf("p=%s  %p \n",oldPointer,oldPointer);

Вывод:

buf=1234567  0028FF0C 
--------bbb-------
buf=changed_9..........  007B8DB0  // видно выделяется новая память под строку
--------bbb-------
buf=changed_18..........  007B8DD0  // видно выделяется опять новая память под строку
p=1234567  0028FF0C 
Яндекс.Метрика