在下面的代碼中,一個 *Pointer 被傳遞給一個函式。
地址 & 符號被省略。
函式仍然可以修改傳遞的指標中的值。
編譯器是否自動添加 &?
char * input();
void get_command() {
char * command_pointer = input();
char * second = second_arg(command_pointer); //second needs to be before first
char * first = first_arg(command_pointer); //becuase first adds a /0
choose(first, second);
free(command_pointer);
}
char * first_arg(char * arg) {
char * j = strchr(arg, '-');
if(j==NULL) {
return arg;
}
*j = '\0';
return arg;
}
char * second_arg(char * arg) {
char * j = strchr(arg, '-');
if( j==NULL ) {
return NULL;
}
return j;
}
uj5u.com熱心網友回復:
編譯器是否自動添加 &?
不,&獲取變數的地址,command_pointer并且不傳遞的地址。只傳遞它的值(緩沖區的地址)。
函式仍然可以修改傳遞的指標中的值。
不,他們不能。他們不能修改指標(的值)。他們只能修改指標指向的那個。
first_arg并且second_arg無法更改command_pointer( 中的變數get_command),因為他們對此一無所知,并且沒有指向它的指標。
例如arg = NULL;不會對command_pointer.
但是,它們可以修改command_pointer指向的資料(chars),因為它們具有相同指標的副本。
例如*arg = 0(又名arg[0] = 0;)會影響*command_pointer(又名command_pointer[0])。
讓我們來說明一些變數get_command和first_arg。
input()'s rv Buffer allocated by input
---------- --- --- --- --- --- --- ---
| 0x1000 ------- --->| | | | | | | ...
---------- | --- --- --- --- --- --- ---
| ^
command_pointer | |
---------- | |
| 0x1000 ------- |
---------- | |
| |
arg | j |
---------- | ---------- |
| 0x1000 ------- | 0x1004 ---------
---------- ----------
input()將地址回傳給它分配的緩沖區(0x1000在圖中)。- 回傳的值
input()被復制到command_pointer. - 的值
command_pointer被復制到arg. - 基于的值
arg存盤在j. get_command可以修改command_pointer和緩沖。first_arg可以修改arg,j和緩沖區,但不能修改command_pointer。
uj5u.com熱心網友回復:
僅當您在指標上使用 * 時才會更改該值。如果你不愿意,值不會改變,地址會改變。考慮這些函式:
char * first_arg(char * arg) {
arg = 'a';
// some other code //
}
char * second_arg(char * arg) {
*arg = 'c';
// some other code //
}
第一個函式將更改arg 指向的地址。這個函式可能很危險,因為我們現在不知道地址“a”中存盤的內容。此函式可能會以意想不到的方式改變 otter 范圍的行為。但它不會改變 arg 指向的值。(除了您硬編碼 arg 的確切地址的情況)
第二個函式將更改arg 指向的地址中的值。這是我們正在尋找的明確定義的行為。這只會改變 arg 指向的記憶體的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/350615.html
