并不是不規(guī)范的問題,你子程序?qū)懛ㄖ荒茉谧映绦蛑休敵稣_的數(shù)據(jù),而在主函數(shù)中無法得到交換過的x和y的值。參考程序運用指針讓子程序去讀寫a和b的值,在子程序執(zhí)行完成后,a和b的值確實得到了交換。
十多年的烏蘭網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整烏蘭建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“烏蘭網(wǎng)站設(shè)計”,“烏蘭網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
你的程序中子程序采用的不是指針類型參數(shù),這樣子程序無法將交換過后的值傳回來。
#includestdio.h
int *d_bubblesort(int a[],int n)//數(shù)組長度為n的冒泡降序排序
{
int i,j;
int temp;
for(i=0;in;i++)
{
for(j=n-1;ji;j--)
{
if(a[j]a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a;
}
void main()
{
int i;
int *p=NULL;
int a[10]={6,5,4,1,2,3,9,8,7,10};
int *(*fun)(int*,int);
fun=d_bubblesort;
p=fun(a,10);
for(i=0;i10;i++)
{
printf("%d\t",p[i]);
}
}
void point(char *p){ p+=3; } //加上void比較好
char b[4]={'a','b','c','d'}, *p=b; //寫在同一行,p是char*的
point(p);// 這里傳遞的是指針,在函數(shù)里面改指針是“臨時變量”,不是局部變量
//臨時對象不會被記錄,如果改p指向的內(nèi)存就可以被記錄。
printf("%c\n", *p); // 輸出結(jié)果為a,因為p是扔指向b[]其實位置
答案為a
1.如果是返回值是指針
char* getname()
{
char* pname=new char[23]; //返回指針必須是函數(shù)釋放后并未釋放的內(nèi)存空間,
cout"input your name:\n"; //一般返回兩種情況,一是在函數(shù)中像該函數(shù)一樣動態(tài)分配堆內(nèi)存
cin.getline(pname,22); //二是返回指針指向參數(shù)中地址,如: int* max(int a,int b) { return a; }
pname[22]='\0';
return pname;
}
int main()
{
char* name=getname();
cout"your name is: "nameendl;
delete []name; //記得動態(tài)釋放分配內(nèi)存
return 0;
}
2.參數(shù)是指針類型
常見的是通過指針或引用交換兩個數(shù)的值
void swa(int* p1,int* p2)
{
int temp=*p1; *p1=*p2; *p2=temp;
}
int main()
{
int a=2,b=3;
swa(a,b); //傳遞地址
return 0;
}
附解:你可以把指針看做是一種復(fù)合類型,它之所以可以修改參數(shù)值,本質(zhì)是因為
對指針解除引用*p形式是操作的參數(shù)所存數(shù)據(jù)內(nèi)存空間,但如果它不解除引用,它
并不會修改參數(shù)的值:如
void swa(int* p1,int* p2) //函數(shù)意思是最初始在函數(shù)參數(shù)塊中定義兩個指針p1,p2,使
{ //p1指向a,p2指向b,下面函數(shù)體只是使指針指向地址改變,成了
//p1指向b,p2指向a。但并未對a,b內(nèi)存空間操作,當(dāng)函數(shù)調(diào)用結(jié)束后,指針p1,p2
//也釋放了,所以并未起任何作用
int* temp;
temp=p1; p1=p2; p2=temp;
}
int main()
{
int a=2,b=3;
swa(a,b); //傳遞地址
couta" "b;
return 0;
}
這個函數(shù)并不會交換a,b的值
在程序運行時,一個函數(shù)占用一段連續(xù)的內(nèi)存。當(dāng)調(diào)用一個函數(shù)時,實際上是跳轉(zhuǎn)到函數(shù)的入口地址,執(zhí)行函數(shù)體的代碼,完成后返回。
函數(shù)指針指向一個函數(shù)的入口地址,也就是函數(shù)存儲空間的首地址。
在C語言中,數(shù)組名代表數(shù)組的首地址,同樣函數(shù)名代表了函數(shù)的首地址,因此在賦值時,直接將函數(shù)指針指向函數(shù)名就行了。
因此函數(shù)指針調(diào)用vs直接調(diào)用,占用的存儲空間都是一樣的。相當(dāng)于數(shù)組指針和數(shù)組名的關(guān)系,指向的都是同一個數(shù)組。
局部變量存在函數(shù)體里面,比如轉(zhuǎn)換成8086匯編(示意):
func: 定義變量
push ax
pop ax
ret
main: call func
滿意請采納,謝謝!
#include"stdio.h"
void sub(int* c,int* d,int* p,int* q)
{
int i,j;
i=(*c)*(*c);
j=(*d)*(*d);
*c=i*j;
*d=(i-j);
*p=i+j;
*q=i-j;
}
void main()
{
int i=3,j=4,k,s;
void sub(int*,int*,int*,int*); //參數(shù)表少個逗號,可以把這一行刪掉,因為sub函數(shù)是在main()前面定義的
sub(i,j,s,k);
printf("k=%d\n",k);
printf("s=%d\n",s);
printf("i=%d\n",i);
printf("j=%d\n",j);
}