从另一个函数保存指针地址

时间:2016-12-21 18:08:09

标签: c pointers

我有一个接收指向char数组的指针的函数。该函数递增指针,使其遍历数组的n长度。最后,该函数返回一个表示某种状态的int。问题是我有其他函数也接收到指向同一个char数组的指针,他们需要开始遍历另一个函数停止的地方。所以我需要以某种方式保存指针的地址。我无法返回指针,因为函数返回int。我想知道我是否还能以某种方式解决这个问题,或者我需要使用结构来保存几种数据类型(int和指针地址)。

以下是此类功能的示例:

int func(char *p) {
    while(*p != 's')
       p++;
    return (*p == 's') ? 1 : -1
}

4 个答案:

答案 0 :(得分:1)

我担心你必须使用双指针。通过将参数更改为char **,在这种情况下,函数看起来会更加丑陋,或者通过添加新的" out" char **类型的参数,它是指针的新值存储的指针的地址 - 模拟另一个返回值。

这是第一个选项:

int func(char **p) {
    while (**p != 's')
        ++*p;
    return **p == 's' ? 1 : -1;
}

答案 1 :(得分:1)

您可以编辑指针:

// The ** means a pointer to a pointer, you can now edit the pointer.
int func(char **p) {
    // Mauybe check for the end of the string here as well.
    while(*(*p) != 's') {
       // We dereference our pointer and edit it here.
       (*p)++;
    }
    return (*(*p) == 's') ? 1 : -1
}

在此功能结束时,p将指向循环停止的位置。你会这样称呼它:

char *p = someString;
int myInt = func(&p);

如果功能签名是固定的,那么如果不在第二个函数中使用全局或相同的循环来“重新找到”这个位置,则无法做到这一点。

答案 2 :(得分:0)

您可以返回包含状态和指针的结构,也可以创建全局指针

答案 3 :(得分:0)

如何指向指针:

$servers = @(

"SERVER1", 
"SERVER2", 
"SERVER3",
"SERVER4"

)

$emailmsg = ""

$sourcePath = "C:\Windows\System32\winevt\Logs\Security.evtx"

$sourceSharePath = $sourcePath.Replace(":", "$")

$targetPath = "\\myserver.com\Shares\folder\for\logs"

$targetName = $sourcePath.split('\')[-1]

$errors = ""

$servers | %{

    $date = get-date -Format MM.dd.yyyy_h.mm.stt

    $server = $_

    $sourceUncPath = "\\$server\$sourceSharePath"

    $uniqueTargetName = $targetName.Replace(".", "-$server-$date.")

    $uniqueTargetPath = "$targetPath\$uniqueTargetName"

    if (Test-Connection $server -Count 1 -Verbose) {

        if (Test-Path $sourceUncPath -Verbose) {

            Copy-Item -Path $sourceUncPath -Destination $uniqueTargetPath -Verbose

#            Clear-EventLog -LogName "Security" -ComputerName $server

        }
        else { $emailmsg += "Path to $server not found`n"}
    }
    else { $emailmsg += "$server Unreachable`n"}
}

$SMTPserver = "my.server.com"
$From = "my@email.com"
$Subject = "Security Log Report"
$Body = ("<html><body><h4><br><br>" + $emailmsg + "</h4></body></html></br></br>")

Send-MailMessage -Verbose -SmtpServer $SMTPserver -To "other@mail.com" -Subject $Subject -From $From -Body $Body -BodyAsHtml

您可以使用以下方式调用它:

int func(char **p) {
    while(**p != 's')
       (*p)++;
    return (**p == 's') ? 1 : -1;
}