我有一个接收指向char数组的指针的函数。该函数递增指针,使其遍历数组的n长度。最后,该函数返回一个表示某种状态的int。问题是我有其他函数也接收到指向同一个char数组的指针,他们需要开始遍历另一个函数停止的地方。所以我需要以某种方式保存指针的地址。我无法返回指针,因为函数返回int。我想知道我是否还能以某种方式解决这个问题,或者我需要使用结构来保存几种数据类型(int和指针地址)。
以下是此类功能的示例:
int func(char *p) {
while(*p != 's')
p++;
return (*p == 's') ? 1 : -1
}
答案 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;
}