并不是不規(guī)范的問題,你子程序?qū)懛ㄖ荒茉谧映绦蛑休敵稣_的數(shù)據(jù),而在主函數(shù)中無法得到交換過的x和y的值。參考程序運(yùn)用指針讓子程序去讀寫a和b的值,在子程序執(zhí)行完成后,a和b的值確實(shí)得到了交換。

10年積累的網(wǎng)站設(shè)計、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有開陽免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
你的程序中子程序采用的不是指針類型參數(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]);
}
}
1、使用場景
使用指針時,必須將它指向一個變量的地址或者為它分配空間方能使用,如下所示:
#includestdio.h
#include stdlib.h
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a數(shù)組首地址
//*b=2;? ?無法直接初始化
//printf("%d\n", *b);
e=e+2;? //移動兩個地址單元
d=c;? //d指向c的地址來表示值
c=4;? ?//修改原c變量的值,d指針的值會發(fā)生改變
b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值
*b=2;//分配空間后可以直接賦值了
printf("this is e,b,c,d :%d %d %d %d\n",*e,*b,c,*d);
2、類型說明
(1)int *a :表示一個指向int型變量的指針,指向的是變量的地址單元
(2)char *b:表示一個指向char變量的指針
*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點(diǎn)要明確,一般用*(a+1)、*(a+2)來表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p\n",*a,*(a+1),a);
擴(kuò)展資料:
指針的運(yùn)算
指針指向變量地址,若原變量的內(nèi)容發(fā)生了變化,它本身也會發(fā)生變化,指針之間的運(yùn)算一般為值運(yùn)算和地址運(yùn)算
(1)值運(yùn)算:直接通過*運(yùn)算方式,像a+*(a+1),結(jié)果為第一個元素與第二個元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址運(yùn)算:通過a+i的方式.指針會指向a的下i個地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d\n",*a);
結(jié)果輸出2。
參考資料來源 :指針-百度百科
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ì)是因?yàn)?/p>
對指針解除引用*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ù): int fun(int a,int b);
要定義指向該函數(shù)的指針
對比指向 int a; 的指針
int *p; p = a;
p的定義是怎么來的?
首先要保證p是一個指針類型
寫下(*p),
然后,考慮下p的基類型,
p的基類型就是變量a的類型int
將int 放在(*p)前面就行了
int (*p);
括號可以省略,就成了 int *p;
同理
想要實(shí)現(xiàn) pf = fun;
(*pf) 將pf定義為一個指針,
將fun的類型作為pf的基類型
fun相當(dāng)于一個 int (int a,int b)類型的量
int (int a,int b) (*pf);
基類型中有圓括號和中括號要后移
int (*pf)(int a,int b) ;//括號不能省略
pf = fun;
調(diào)用時
(*pf)(3,4); pf(3,4)都可以
文章題目:c語言函數(shù)如何調(diào)用指針,c語言函數(shù)調(diào)用指針參數(shù)
URL網(wǎng)址:http://chinadenli.net/article39/dsioesh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、商城網(wǎng)站、網(wǎng)站排名、搜索引擎優(yōu)化、微信小程序、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)