性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

如何學(xué)好C語言-指針


 復(fù)習(xí)運算符
(關(guān)系運算與邏輯運算)

#include "stdio.h"

void main()

{

  int a=1,b=2,m=0,n=0,k;printf("%d\n",m);

  k=(n=b>a)||(m=aa-b?a++:++b,++a,b+5));

}//%d 整形輸出  %c 字符  %s 字符串 %f 浮點

復(fù)習(xí)函數(shù)(帶形參的返回函數(shù)值可以做判斷語句的條件)

#include “stdio.h”

char delay(char t);

char delay(char t)  //t=3

{

t++;   //t=4

return t;

}

void main()

{

char i=8,k;

 if(i>delay(2))

 {

 	k=delay(3);  //k=4

 	i++;    //i=9

 	printf("k=%d,i=%d",k,i);

 	}   

}

復(fù)習(xí)全局變量做形參其值不變

#include "stdio.h"

void delay(int y);

int y=3;

void delay(int y)  //y=5

{

  for(;y<6;y++);

  printf("y1=%d\n",y);  //y=6

} 

void main()

{

int  mm;

delay(5);

printf("y2=%d\n",y); //y=3

mm=y++;  //mn=3,y=4

printf("y3=%d\n",y);

指針數(shù)組(里面存放的是指針,如果是字符串則存放的是字符串的首地址)

#include "stdio.h"

void main()

{

char i=0,*p[3]={"wejlj","dsag","dsfads"} ;  

for(;i<3;i++)

{

printf("%c \n",*(p[i]));

}

}

#include "stdio.h"

main(){

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]={a[0],a[1],a[2]};

int *p=a[0];

  int i;

  for(i=0;i<3;i++)

      printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));

  for(i=0;i<3;i++)

      printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));

}

指針函數(shù)與函數(shù)指針的區(qū)別

1、指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個函數(shù)。函數(shù)返回類型是某一類型的指針

類型標(biāo)識符 *函數(shù)名(類型 參數(shù)表)

int *f(int x,int y);

首先它是一個函數(shù),只不過這個函數(shù)的返回值是一個地址值。函數(shù)返回值必須用同類型的指針變量來接受,也就是說,指針函數(shù)一定有函數(shù)返回值,而且,在主調(diào)函數(shù)中,函數(shù)返回值必須賦給同類型的指針變量。

表示:

float *fun();

float *p;

p = fun(a);

注意指針函數(shù)與函數(shù)指針表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函數(shù)名前面的指針*號有沒有被括號()包含,如果被包含就是函數(shù)指針,反之則是指針函數(shù)。

來講詳細一些吧!請看下面

指針函數(shù):
當(dāng)一個函數(shù)聲明其返回值為一個指針時,實際上就是返回一個地址給調(diào)用函數(shù),以用于需要指針或地址的表達式中。
格式:
類型說明符 * 函數(shù)名(參數(shù))
當(dāng)然了,由于返回的是一個地址,所以類型說明符一般都是int。
例如:int *GetDate(void);
int * aaa(int,int);
函數(shù)返回的是一個地址值,經(jīng)常使用在返回數(shù)組的某一元素地址上。

#include "stdio.h"

int * GetDate(int wk,int dy);

main()

{

int wk,dy;

do

{

printf("Enter week(1-5)day(1-7)\n");

scanf("%d%d",&wk,&dy);

}

while(wk<1||wk>5||dy<1||dy>7);  // wk=2;dy=3

printf("%d\n",*GetDate(wk,dy));

}

int * GetDate(int wk,int dy)

{

static int calendar[5][7]=

{

{1,2,3,4,5,6,7},

{8,9,10,11,12,13,14},

{15,16,17,18,19,20,21},

{22,23,24,25,26,27,28},

{29,30,31,-1}

}; //不釋放空間

return &calendar[wk-1][dy-1]; //1,2

}
程序應(yīng)該是很好理解的,子函數(shù)返回的是數(shù)組某元素的地址。輸出的是這個地址里的值。

#include "stdio.h"

main(){

  int i;

  char *day_name(int n);   

  printf("input Day No:\n");

  scanf("%d",&i);

  if(i<0) exit(1);

  printf("Day No:%2d-->%s\n",i,day_name(i));

}

char *day_name(int n){

  static char *name[]={ "Illegal day",

                        "Monday",

                        "Tuesday",

                        "Wednesday",

                        "Thursday",

                        "Friday",

                        "Saturday",

                        "Sunday" };

  return((n<1||n>7) ? name[0] : name[n]);

}

2、函數(shù)指針是指向函數(shù)的指針變量,即本質(zhì)是一個指針變量。

類型說明符 (*函數(shù)名)(參數(shù))

int        (*f)  (int x); /* 聲明一個函數(shù)指針 */

 f=func; /* 將func函數(shù)的首地址賦給指針f */ 

指向函數(shù)的指針包含了函數(shù)的地址,可以通過它來調(diào)用函數(shù)。聲明格式如下:
類型說明符 (*函數(shù)名)(參數(shù))
其實這里不能稱為函數(shù)名,應(yīng)該叫做指針的變量名。這個特殊的指針指向一個返回整型值的函數(shù)。指針的聲明必須和它指向函數(shù)的聲明保持一致。
指針名和指針運算符外面的括號改變了默認的運算符優(yōu)先級。如果沒有圓括號,就變成了一個返回整型指針的函數(shù)的原型聲明。
例如:
void (*fptr)();
把函數(shù)的地址賦值給函數(shù)指針,可以采用下面兩種形式:
fptr=&Function;
fptr=Function;
取地址運算符&不是必需的,因為單單一個函數(shù)標(biāo)識符就標(biāo)號表示了它的地址,如果是函數(shù)調(diào)用,還必須包含一個圓括號括起來的參數(shù)表。
可以采用如下兩種方式來通過指針調(diào)用函數(shù):
x=(*fptr)();
x=fptr();
第二種格式看上去和函數(shù)調(diào)用無異。但是有些程序員傾向于使用第一種格式,因為它明確指出是通過指針而非函數(shù)名來調(diào)用函數(shù)的。下面舉一個例子:

#include "stdio.h"

void (*funcp)();

void FileFunc(),EditFunc();

main()

{

funcp=FileFunc;

(*funcp)();

funcp=EditFunc;

(*funcp)();

}

 

void FileFunc()

{

printf("FileFunc\n");

}

 

void EditFunc()

{

printf("EditFunc\n");

}

程序輸出為:
FileFunc
EditFunc

例2

#include"stdio.h" 

//定義一個函數(shù)指針,形參為一個char類型,一個int類型,返回類型為void 

void (*pf)(char, int); 

void fun(char ,int);  //聲明一個函數(shù),形參為一個char類型,一個int類型,返回類型為void 

int main(void) 

{ 

      pf=fun;            //給函數(shù)指針pf賦值為fun函數(shù)的首地址(函數(shù)名代表函數(shù)的首地址) 

 

  (*pf)('c',372);        //調(diào)用pf指向的函數(shù) 

  }  

void fun(char a,int b) 

{ 

       printf("the argument    is %c and %d\n",a,b); 

}

主要的區(qū)別是一個是指針變量,一個是函數(shù)。在使用是必要要搞清楚才能正確使用

二、指針的指針
指針的指針看上去有些令人費解。它們的聲明有兩個星號。例如:
char ** cp;
如果有三個星號,那就是指針的指針的指針,四個星號就是指針的指針的指針的指針,依次類推。當(dāng)你熟悉了簡單的例子以后,就可以應(yīng)付復(fù)雜的情況了。當(dāng)然,實際程序中,一般也只用到 二級指針,三個星號不常見,更別說四個星號了。
指針的指針需要用到指針的地址。
char c='A';
char *p=&c;
char **cp=&p;
通過指針的指針,不僅可以訪問它指向的指針,還可以訪問它指向的指針?biāo)赶虻臄?shù)據(jù)。下面就是幾個這樣的例子:
char **p1=*cp;
char c1=**p1;
你可能想知道這樣的結(jié)構(gòu)有什么用。利用指針的指針可以允許被調(diào)用函數(shù)修改局部指針變量和處理指針數(shù)組。

#include "stdio.h"

void FindCredit(int **);

main()

{

int vals[]={7,6,5,-4,3,2,1,0};

int *fp=vals;

FindCredit(&fp);

printf("%d\n",*fp);

}

void FindCredit(int ** sp)

{

while(**sp!=0)

if(**sp<0) break;

else (*fpp)++;

}
首先用一個數(shù)組的地址初始化指針fp,然后把該指針的地址作為實參傳遞給函數(shù)FindCredit()。FindCredit()函數(shù)通過表達式**fpp間接地得到數(shù)組中的數(shù)據(jù)。為遍歷數(shù)組以找到一個負值,F(xiàn)indCredit()函數(shù)進行自增運算的對象是調(diào)用者的指向數(shù)組的指針,而不是它自己的指向調(diào)用者指針的指針。語句(*fpp)++就是對形參指針指向的指針進行自增運算的。但是因為*運算符高于++運算符,所以圓括號在這里是必須的,如果沒有圓括號,那么++運算符將作用于二重指針fpp上。

三、指向指針數(shù)組的指針
指針的指針另一用法舊處理指針數(shù)組。有些程序員喜歡用指針數(shù)組來代替多維數(shù)組,一個常見的用法就是處理字符串。

#include "stdio.h"

char *Names[]={"Bill","Sam","Jim","Paul","Charles","0"};

main()

{

char **nm=Names;

while(**nm!=‘0’)

printf("%s\n",*nm++);

}

先用字符型指針數(shù)組Names的地址來初始化指針nm。每次printf()的調(diào)用都首先傳遞指針nm指向的字符型指針,然后對nm進行自增運算使其指向數(shù)組的下一個元素(還是指針)。注意完成上述認為的語法為*nm++,它首先取得指針指向的內(nèi)容,然后使指針自增。
  深圳廣州南寧長沙鄭州嵌入式單片機C語言技術(shù)提升聯(lián)系郭老師qq754634522,年底優(yōu)惠多多,添加咨詢可免費領(lǐng)取學(xué)習(xí)優(yōu)惠券哦

注意數(shù)組中的最后一個元素被初始化為0,while循環(huán)以次來判斷是否到了數(shù)組末尾。具有零值的指針常常被用做循環(huán)數(shù)組的終止符。程序員稱零值指針為空指針(NULL)。采用空指針作為終止符,在數(shù)組增刪元素時,就不必改動數(shù)組的代碼,因為此時數(shù)組仍然以空指針作為結(jié)束。

#include "stdio.h"

main()

{

char *name[]=

{"Follow me","BASIC","Great Wall","FORTRAN","Computer desighn"};

char **p;

int i;

for(i=0;i<5;i++)

{

  p=name+i;

  printf("%s\n",*p);

 }

}

/* typedef與define之間的區(qū)別*/

#include "stdio.h"

#define PIN1 int * 

typedef int * PIN2;

void main()

 {

 	PIN1 a=1,b=1;

 	PIN2 c=3,d=3;

 	printf("%d",a);  //a是 指針  1

 	printf("\n");

 	printf("%d",a+1); //a地址加1,由于是整型占4個字節(jié)  5

 	printf("\n");

 	printf("%d",b);  //b是 整型 值  1

 	printf("\n");

 	printf("%d",b+1); //b的值自增1   2

 	printf("\n");

 	printf("%d",c);   //c是 指針   1

 	printf("\n");

 	printf("%d",c+1);  //c地址加1,由于是整型占4個字節(jié)  5

 	printf("\n");

 	printf("%d",d);   //d是 指針   1

 	printf("\n");

 	printf("%d",d+1);  //d地址加1,由于是整型占4個字節(jié)  5

 	}
全部回復(fù)(3)
正序查看
倒序查看
lingyan
LV.8
2
2017-11-18 12:45
學(xué)習(xí)了
0
回復(fù)
ruohan
LV.9
3
2017-12-05 16:50
@lingyan
學(xué)習(xí)了
學(xué)習(xí)了
0
回復(fù)
2018-01-17 13:32
學(xué)習(xí)了!
0
回復(fù)
發(fā)