⑴ C語言的指向函數的指針的問題
函數指針就是一個函數的首地址,這個在匯編裡面最好看明白了.
比如:int * a (int i, int j) ; 假設a的值是:0x3312FF80,,下面是匯編調用的例子.
push j
push i
call 0x33FF80
上面是調用方法,而int* a(int i, int j); 的返回值也很容易看出來,返回一個DWORD類型的一個指針而已.反匯編應該是 return n;這里的n是四個位元組,應為返回是一個指針類型,在32位下指針就是4位元組.
我有仔細研究了下你的問題,你是弄不明白 int* a() 和int (*p)() 嗎?還是別的什麼意思?請繼續追問.
是否可以解決您的問題?
⑵ C語言函數及指針問題.
這個理解起來其實很簡單
只要記住一點,實參和形參不在一個內存地址中就可以,改變形參不會改變實參的
但是有一個例外,就是在聲明子函數是,參數帶&,這表示實參形參公用一個內存地址
在調用x1函數時,i j會另外申請內存地址,那麼交換了ij,但是ab所在的內存地址的內容是不會改變的
調用x2時,傳遞過去的是ab的內存地址,並且在子函數中,交換了ab內存地址中的內容,那麼ab就交換了
這個主意兩點
1,交換了ab內存地址(也就是指針)中的內容,但是你看在子函數中,指針是沒有交換的,所以說傳遞過去的參數是沒有改變,只是改變了指向的地址中的內容
2,要是在子函數中聲明的c是指針,如果用c=i;i=j;j=c,那麼只是交換了指針,而指針指向的內容還是沒有改變,並且在主函數中,這兩個參數指針還是沒有改變。道理同第一個,因為實參和形參是占不同的內存地址,
⑶ 關於C語言中指針函數的問題
不行, 原因是found函數已經聲明成返回一個int指針的函數了,如果不聲明p為指針則在p=founc(a,n)時會因為類型不匹配而報錯。兩種方法可以解決:1,直接省略掉變數p,在printf語句中直接用printf("%d", *found(a,n));來輸出結果;2,修改found函數為:<pre t="code" l="cpp">int found(int b[10], int n)
{
return b[n-1];
}則p可以直接聲明為int, 且賦值時用p=found(a,n); 輸出時用printf("%d", p);可以看到這樣改動的比較多。
⑷ c語言指針函數問題,求解題過程!謝謝!
a是全局變數,所以每調用一次函數這個值就被+1。
s[d] = s[a] 就是賦值語句,相當於改變主函數中的t數組。
總共調用了4次fun函數。
1。s[4] = s[0],此時t數組為{1,3,5,7,1}
2。s[3] = s[1] ,此時t數組為{1,3,5,3,1}
後面的你類似再推導就行了,最後的輸出是:13531。
不過這個程序也有點問題,就是k並沒有定義。
⑸ C語言函數指針問題
第一是:函數指針的使用 ,可以不用*號,也能正確使用
第二是:取出指針P對應的內容,加一後 使用
⑹ c語言,函數里的指針問題
這個其實很好理解
只需要把%s,%c,%p放在一起看
首先%s是最常見的很好理解,就是告訴程序後面的變數是一個字元串,在C語言中也就是字元數組,類型是char*或者char[],換句話說,你告訴程序我會給你一個指針,你去讀這個指針指向的值。
然後%c是告訴程序後面的變數是個字元,類型是char,差別已經很明顯了,這時候你告訴程序我給你提供一個字元,你給我在%c處列印出來。然而你給的卻是一個指針,那程序就直接把你給的指針指向的地址本身當成字元列印出來了。但是一個地址肯定不止一個位元組,也就是說超過了char應該有的大小,這時候程序會直接忽略了超出大小的部分,只讀第一個位元組。
如果你同時使用%p,告訴程序,你會提供一個指針,直接把這個指針指向的地址給我列印出來。把輸出的地址最後兩位的16進制數查ascii表,換算成字元,你會發現,剛好就是前面%c列印出的字元。
⑺ 關於C語言函數指針的問題
首先,編譯器對於很多操作都有隱式轉換.
其次,函數指針指向的是編譯後的函數代碼(機器指令)的首地址.
因此你用星號操作指針難道要訪問指令嗎?函數唯一的訪問方式就是調用,因此編譯器做了默認處理,無論有沒有星號都是調用函數,這種由編譯器自動決定操作叫隱式轉換.(其他編譯器有可能會報錯)
PS:盡量不要利用隱式轉換而偷懶,因為依賴編譯器的自動功能會存在安全隱患,因為不同的編譯器隱式轉換有所不同,代碼還是明確點比較安全.因為即便更新編譯器版本你的程序也不會出問題.
⑻ 關於c語言函數指針的問題
1.fun是一個函數指針,即fun還不是一個函數,只是一個可以指向函數的指針,利用這個指針可以調用函數,這個函數的返回值為空,帶有一個int型參數.例如:
void f(int x)
{
printf("%d",x);
}
void main()
{
void(*fun)(int);
fun=f; //fun指向函數f
fun(10);//通過fun調用函數f
}
2.void *fun(int),這個fun是一個指針函數,即函數返回值不是函數值本身,而是函數值的地址,也就是說,fun是函數值為指針的函數;但這個定義沒有意義,因為函數類型為void,即不必使用函數值
⑼ C語言指向函數指針問題
#include
<stdio.h>
void
main()
{
int
max(int
,int
);
int
(*p)(int
,int);
p=max;
//此處利用
p=max是正確的指向函數的指針的用法,p指向max的入口地址
//此處用*p=max得到相同結論,為什麼呢?因為你這樣賦值之後*p的內容就是max
//所以在執行(*p)(q,w)它時其實是執行的(max)(q,w),如果是p=max此時執行(*p)(q,w)是等價於執行max(q,w)。
int
q,w;
printf("please
input
the
two
numbers:\n");
scanf("%d%d",&q,&w);
printf("the
larger
number
is:%d",(*p)(q,w));
}
////////////////////////////////////
int
max(int
a,int
b)
{
if(a>b)
return
a;
else
return
b;
}
⑽ 關於C語言指針函數的問題
char*connect(char*dst,char*src)
{
char*q,*p;
for(p=dst;*p;p++);//將p指針移動到dst數組的結束符0的位置
for(q=src;*q;q++,p++)//dst從結束符開始,src從首地址開始,一一對應傳值
*p=*q;
*p=0;
returndst;
}