Как изменить значение указателя char в swap? [Дубликат]

Мы можем получить список файлов внутри папки в файловой системе, используя различные стандартные библиотечные функции golang.

  1. filepath.Walk
  2. ioutil.ReadDir
  3. os.File.Readdir

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    var (
        root  string
        files []string
        err   error
    )

    root := "/home/manigandan/golang/samples"
    // filepath.Walk
    files, err = FilePathWalkDir(root)
    if err != nil {
        panic(err)
    }
    // ioutil.ReadDir
    files, err = IOReadDir(root)
    if err != nil {
        panic(err)
    }
    //os.File.Readdir
    files, err = OSReadDir(root)
    if err != nil {
        panic(err)
    }

    for _, file := range files {
        fmt.Println(file)
    }
}
  1. Использование filepath.Walk

Пакет path/filepath предоставляет удобный способ сканирования всех файлов в каталоге, он автоматически сканирует каждый подкаталог в каталоге.

blockquote>
func FilePathWalkDir(root string) ([]string, error) {
    var files []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            files = append(files, path)
        }
        return nil
    })
    return files, err
}
  1. Использование ioutil.ReadDir

ioutil.ReadDir читает каталог с именем dirname и возвращает список записей в каталоге, отсортированных по имени файла.

blockquote>
func IOReadDir(root string) ([]string, error) {
    var files []string
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}
  1. Использование os.File .Readdir

Readdir считывает содержимое каталога, связанного с файлом, и возвращает срез до n значений FileInfo, как было бы возвращено Lstat, в порядке каталога. Последующие вызовы в том же файле приведут к дальнейшему FileInfos.

blockquote>
func OSReadDir(root string) ([]string, error) {
    var files []string
    f, err := os.Open(root)
    if err != nil {
        return files, err
    }
    fileInfo, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}

Результаты теста.

Получить подробнее об этом сообщении в блоге

30
задан Ian R. O'Brien 30 March 2016 в 15:05
поделиться

4 ответа

Потому что вы передаете копию указателя. Чтобы изменить указатель, вам нужно что-то вроде этого:

void foo(int **ptr) //pointer to pointer
{
    *ptr = new int[10]; //just for example, use RAII in a real world
}

или

void bar(int *& ptr) //reference to pointer (a bit confusing look)
{
    ptr = new int[10];
}
64
ответ дан Andrew 20 August 2018 в 08:06
поделиться
  • 1
    Но когда я пробую ваш подход, он падает на эту строку *targetBubble = bubbles[i];, и я передаю такой аргумент clickOnBubble(mousePos, bubbles, &targetBubble); – c0ntrol 7 August 2012 в 10:28
  • 2
    @ user1295618: какая ошибка вы видите? Возможно, я вне пределов досягаемости – Andrew 7 August 2012 в 10:35
  • 3
    Ошибка сегментации – c0ntrol 7 August 2012 в 10:41
  • 4
    @ user1295618: задайте новый вопрос и напишите свой новый код там. Потому что трудно сказать, в чем проблема, не видя ваш фактический код – Andrew 7 August 2012 в 10:42
  • 5
    Но второй подход работает, спасибо. – c0ntrol 7 August 2012 в 10:49

, если вы пишете

int b = 0;
foo(b);

int foo(int a)
{
  a = 1;
}

, вы не меняете 'b', потому что a является копией b

, если вы хотите изменить b, вам нужно будет передать адрес из b

int b = 0;
foo(&b);

int foo(int *a)
{
  *a = 1;
}

одинаково для указателей:

int* b = 0;
foo(b);

int foo(int* a)
{
  a = malloc(10);  // here you are just changing 
                   // what the copy of b is pointing to, 
                   // not what b is pointing to
}

, поэтому для изменения, где b указывает, чтобы передать адрес:

int* b = 0;
foo(&b);

int foo(int** a)
{
  *a = 1;  // here you changing what b is pointing to
}

hth

18
ответ дан Anders K. 20 August 2018 в 08:06
поделиться

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

Прочитайте этот вопрос, чтобы лучше понять различия в деталях . Когда пройти мимо ссылку и когда передать указатель в C ++?

6
ответ дан Community 20 August 2018 в 08:06
поделиться

Вы передаете указатель по значению.

Передайте ссылку на указатель, если вы хотите его обновить.

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
21
ответ дан Daniel Daranas 20 August 2018 в 08:06
поделиться
  • 1
    +1. Первый ответ, который делает это правильно в контексте C ++. Ответы, предлагающие двунаправленные указатели, - это старая возможность сделать это. – paxdiablo 7 August 2012 в 10:02
Другие вопросы по тегам:

Похожие вопросы: