2013-01-15 52 views
4

好吧,我試圖將字符指針傳遞給另一個函數。我可以用char數組做這個,但不能用char指針來做。問題是我不知道它的大小,所以我不能在main()函數中聲明關於大小的任何信息。在C中傳遞字符指針

#include <stdio.h> 

void ptrch (char * point) { 
    point = "asd"; 
} 

int main() { 
    char * point; 
    ptrch(point); 
    printf("%s\n", point); 
    return 0; 
} 

然而,這並不正常工作,這兩部作品:

1)

#include <stdio.h> 

int main() { 
    char * point; 
    point = "asd"; 
    printf("%s\n", point); 
    return 0; 
} 

2)

#include <stdio.h> 
#include <string.h> 

void ptrch (char * point) { 
    strcpy(point, "asd"); 
} 

int main() { 
    char point[10]; 
    ptrch(point); 
    printf("%s\n", point); 
    return 0; 
} 

所以我試圖瞭解原因和可能的解決我的問題

回答

5
void ptrch (char * point) { 
    point = "asd"; 
} 

你的指針是通過值,並且此代碼副本,然後覆蓋副本。所以原始的指針是不變的。

P.S.點要注意的是,當你做point = "blah"要創建一個字符串,任何企圖修改未定義行爲,所以它應該是const char *

要解決 - 傳遞指針如@Hassan TM那樣指向,或者返回指針,如下所示。

const char *ptrch() { 
    return "asd"; 
} 

... 
const char* point = ptrch(); 
+0

哪種方式更便宜? –

+0

@SarpKaya都非常快速(如果有的話,差異會很小),但我更喜歡「返回指針」方法以提高可讀性。 –

+0

如果您不將返回值硬編碼爲字符串文字,將觸發局部變量的警告。 – Zimano

2

這裏:

int main() { char * point; ptrch(point);

你按值傳遞point。然後,ptrch將其自己的本地副本point設置爲指向"asd",而pointmain保持不變。

的溶液。將指針傳遞給mainpoint

void ptrch(char **pp) { *pp = "asd"; return; }

11

到炭指針傳遞這應該自指針工作。因此,指針的任何更改都會在其後看到。

void ptrch (char ** point) { 
    *point = "asd"; 
} 

int main() { 
    char * point; 
    ptrch(&point); 
    printf("%s\n", point); 
    return 0; 
} 
+0

我本來希望返回指針而不是另一個間接級別,但+1 –

1

如果更改一個函數指針的值,它只能保持在一個函數調用改變。 不要惹你的頭指針和嘗試:

void func(int i){ 
    i=5; 
} 
int main(){ 
    int i=0; 
    func(i); 
    printf("%d\n",i); 
    return 0; 
} 

同你的指針。你做不是改變它指向的地址。

如果分配給按值傳遞的變量,函數外部的變量將保持不變。 你可以通過一個指針(指針)將它傳遞,並通過去除它來改變它,它與int相同 - 在這種情況下,如果類型是int或char *則無關緊要。

0

首先聲明funtion ......這樣

#include<stdio.h> 
void function_call(char s) 

下一個寫主代碼.....

void main() 
{ 
    void (*pnt)(char); // pointer function declaration.... 
    pnt=&function_call; // assign address of function 
    (*pnt)('b'); // call funtion.... 
}