在myfunc()函数中,指针param指向string指针。它看起来像这样:
---
param |-|--
--- |
|
|
---
string |-|----
--- |
|
|
--------------------------
|h|e|l|l|o|_|W|o|r|l|d|\0|
--------------------------
当你这样做param++时,它将导致指针在你的平台上增加指针1)的大小,因为param可以指向一个char指针。假设指针的大小为8(64位平台)并假设string指针的地址为100,param++则将导致指针param指向108地址。请注意,它无论如何都不会影响 string指针。它看起来像这样:
108
--- ---
param++ --> param |-|-------| |
--- ---
---
string |-|----
--- |
|
|
--------------------------
|h|e|l|l|o|_|W|o|r|l|d|\0|
--------------------------
现在,当您打印stringinmain()函数时,您将获得输出“hello_World”。
为了证明这一点,我printf()在您的程序中添加了一些语句:
#include <stdio.h>
void myfunc(char** param){
printf ("param : %p\n", (void *)param);
printf ("*param : %p\n", (void *)*param);
param++;
printf ("param : %p\n", (void *)param);
printf ("*param : %p\n", (void *)*param);
}
int main(void){
char* string = "hello_World";
printf ("string : %p\n", (void *)string);
myfunc(&string);
printf ("string : %p\n", (void *)string);
printf("%s\n", string);
return 0;
}
输出:
string : 0x10a654f97
param : 0x7ffee55abad0
*param : 0x10a654f97
param : 0x7ffee55abad8 ======> result of incrementing param
*param : 0xcb7d025 ======> result of incrementing param
string : 0x10a654f97 ======> not affected
hello_World
要获得所需的行为,在myfunc()函数中,您应该首先取消引用param指针以获取string指针,然后递增它,即您应该这样做(*param)++。这将导致string指针按char1)的大小递增:
---
param |-|--
--- |
|
|
---
(*param)++ --> string |-|-------
--- |
|
|
--------------------------
|h|e|l|l|o|_|W|o|r|l|d|\0|
--------------------------
示范:
#include <stdio.h>
void myfunc(char** param){
printf ("param : %p\n", (void *)param);
printf ("*param : %p\n", (void *)*param);
(*param)++;
printf ("param : %p\n", (void *)param);
printf ("*param : %p\n", (void *)*param);
}
int main(){
char* string = "hello_World";
printf ("string : %p\n", (void *)string);
myfunc(&string);
printf ("string : %p\n", (void *)string);
printf("%s\n", string);
return 0;
}
输出:
string : 0x100de5f97
param : 0x7ffeeee1aad0
*param : 0x100de5f97
param : 0x7ffeeee1aad0
*param : 0x100de5f98
string : 0x100de5f98
ello_World
- 当增加一个指针时,它会以指针可以指向的对象大小为单位递增。