日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

带参函数_更好的理解Python第五弹函数预处理与指针

發(fā)布時(shí)間:2025/3/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带参函数_更好的理解Python第五弹函数预处理与指针 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編譯預(yù)處理

預(yù)處理概念:在編譯之前進(jìn)行處理

在C語(yǔ)言中,預(yù)處理行為宏定義,文件包含,條件編譯

指令用處
#無(wú)
#define定義一個(gè)宏
#undef?取消定義一個(gè)已經(jīng)定義的宏
#include包含一個(gè)頭/源文件
#if若為真,編譯以下代碼
#ifdef若宏已定義,則編譯以下代碼
#ifndef若宏沒(méi)有定義,這編譯以下代碼
#elif若前#if為假,此處為真,則編譯以下代碼,相當(dāng)于elseif
#endif結(jié)束一個(gè)#if...#else條件編譯快
#error停止編譯并顯示錯(cuò)誤信息
#line強(qiáng)行改變的文件號(hào)和行號(hào)

宏定義:指的是批量處理,即使用簡(jiǎn)單的操作來(lái)替代復(fù)雜的操作,在C語(yǔ)言中,宏定義可以使用一個(gè)標(biāo)識(shí)符替代一個(gè)字符串

一般形式:

#define?標(biāo)識(shí)符?[(參數(shù))] 字符串

優(yōu)點(diǎn):方便程序編輯與修改,與使用自定義函數(shù)相比,使用宏定義無(wú)需“保留函數(shù)現(xiàn)場(chǎng)”,可提高運(yùn)行效率,

缺點(diǎn):嵌套影響可讀性,帶參定義容易出現(xiàn)參數(shù)非法的問(wèn)題,宏定義不易執(zhí)行復(fù)雜問(wèn)題。

#include #define x1 3*x*x#define x2(r) (3*(r)*(r)#define?x3?"明天星期幾?"

字符串

以0(整數(shù)0)結(jié)尾的一串字符

0或‘\0’是一樣的,但是和‘0’不同

0標(biāo)志字符串的結(jié)束,但它不是字符串的一部分

計(jì)算字符串長(zhǎng)度的時(shí)候不包含這個(gè)0

字符串以數(shù)組的形式存在,以數(shù)組或指針的形式訪問(wèn)

更多的是以指針的形式

string.h里有很多處理字符串的函數(shù)

指針

計(jì)算機(jī)系統(tǒng)中運(yùn)行的程序和數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)內(nèi)部存儲(chǔ)器中,把存儲(chǔ)器中的一個(gè)字節(jié)成為一個(gè)存儲(chǔ)單元也成內(nèi)存單元。

內(nèi)存是由線性連續(xù)的存儲(chǔ)單元組成。

C語(yǔ)言中的每一個(gè)實(shí)體,都要在內(nèi)存中占有一個(gè)可標(biāo)識(shí)的存儲(chǔ)區(qū)域,稱為存儲(chǔ)空間

在內(nèi)存中每一個(gè)存儲(chǔ)單元都有一個(gè)地址,根據(jù)地址可以找到存儲(chǔ)單元的值,將這個(gè)地址稱為存儲(chǔ)單元指針,簡(jiǎn)稱指針

存儲(chǔ)空間的第一個(gè)字節(jié)的地址(起始地址,首地址)稱為變量的地址,也稱變量的指針。

指針變量的值是內(nèi)存中的地址值,那么C語(yǔ)言中的存儲(chǔ)空間`的首地址就可以賦值給指針變量,一個(gè)存儲(chǔ)空間的首地址可以稱為該實(shí)體的地址,也稱為該實(shí)體的指針。由于每個(gè)實(shí)體都是連續(xù)存儲(chǔ)的,當(dāng)定義了指針變量后,就可以把某個(gè)實(shí)體的地址賦值給指針變量,然后通過(guò)指針變量的值來(lái)簡(jiǎn)介訪問(wèn)該實(shí)體。

指針可以利用地址,直接指向內(nèi)存中的任意一個(gè)地址,并通過(guò)該地址找到地址當(dāng)中存儲(chǔ)的數(shù)據(jù)。

指針可以直接修改內(nèi)存,因此指針的使用時(shí)快捷性,高效性,自由的,危險(xiǎn)的。

注意:指針不僅可以修改C程序中的數(shù)據(jù),更可以修改計(jì)算機(jī)內(nèi)存的一切值,在不清楚后果的情況下,這種修改是危險(xiǎn)的

?指針可以指向一個(gè)變量對(duì)應(yīng)的地址,但不能直接將這個(gè)地址按照整數(shù)形式賦值給指針變量

%p??//?按照指針形式輸出數(shù)據(jù)printf("%d",grade)??//輸出grade的值printf("%d",&grade)???//輸出grade的內(nèi)存地址int?grade?//?grade會(huì)被賦值隨機(jī)值int?*grade??//會(huì)被賦值隨機(jī)地址sizeof()???//占空間的字節(jié)數(shù)

指針的定義:

數(shù)據(jù)類(lèi)型?*?指針名

int?*?ptr_num,*ptr_Maxfloat * p_averagechar?*?p_ch1,*P_ch2

注:在定義時(shí):寫(xiě)的*是一個(gè)說(shuō)明,標(biāo)志其后的變量是指針變量,如int * ptr_Max ,ptr_Max是指針名稱

與普通變量一樣,指針先定義,再賦值,再使用,對(duì)于指針的賦值,一般理解為指向。

定義指針時(shí)的數(shù)據(jù)類(lèi)型應(yīng)當(dāng)與指針指向的數(shù)據(jù)類(lèi)型一致。

指針的初始化:????

指針變量可以初始化一個(gè)地址,0或NULL,(指針變量使用過(guò)程中必須要有確定的值)

數(shù)據(jù)類(lèi)型?*?指針名?=?變量地址如:int?*?point_num =#// &?:地址運(yùn)算符,取變量的地址// * :指針運(yùn)算,去指針指向的內(nèi)存地址中存儲(chǔ)的值// *與&?互為逆運(yùn)算

指針的賦值

將變量所在的地址賦值給指針(直接賦值)

將指針指向的地址賦值給指針(簡(jiǎn)介賦值)

指針的運(yùn)算:

算數(shù)運(yùn)算就是對(duì)指針變量加上或減去一個(gè)整數(shù),使指針變量指向相鄰的存儲(chǔ)單元。

  • 如果指針運(yùn)算時(shí)指針前帶有*,相當(dāng)于指針指向的內(nèi)存地址中存儲(chǔ)的數(shù)據(jù)參與了運(yùn)算,即數(shù)值相運(yùn)算。

  • 如果直接用指針參數(shù)運(yùn)算,指針的加,減,代表內(nèi)存中向高,低地址方向,移動(dòng)一個(gè)指針類(lèi)型所占據(jù)的內(nèi)存空間。

  • 數(shù)據(jù)表示兩個(gè)指針指向內(nèi)存之間相隔多少個(gè)元素。

  • 指針相減或比較大小時(shí),必須是同一數(shù)據(jù)類(lèi)型。

(字符串以“\o”結(jié)尾)

說(shuō)明:

  • char *pp =str ,相當(dāng)于指針pp指向了字符串,str的首地址,并非指針pp相當(dāng)于整個(gè)字符串。

  • 運(yùn)行PP++可以實(shí)現(xiàn)指針PP在字符串中指向下一個(gè)字符

  • 由于單目運(yùn)算符的結(jié)合律均從右向左,因此*pp++的市級(jí)意義為*(PP++),相當(dāng)于PP++,*?沒(méi)有起作用。

    同理,++*p相當(dāng)于++(*p),即指針p指向變量的值自增1,而非指針p向下移動(dòng)。

  • 指針的比較達(dá)標(biāo)其指向變量的地址的大小比較

  • 地址越靠前越小

取地址預(yù)算符&

#include "stdio.h"int main(){????char?c?='A',*p=&c;??//?類(lèi)型說(shuō)明符“*”,取地址運(yùn)算符“&” printf("int c=%d\t char c =%c\t &c=0x%x\n",c,c,&c); printf("int*p =%d\t char*p=%c\t p=%#X\n",*p,*p,p); return 0;}

輸出:

int c=65 char c =A &c=0x61ff1bint*p?=65????????char*p=A????????p=0X61FF1B

間接訪問(wèn)運(yùn)算符“*”

#include "stdio.h"int main(){ int i=37,*p=&i; printf("i=%d,*p=%d\n",i,*p); *p=5; *p*=*p+15; //注意間接訪問(wèn)符與乘數(shù)運(yùn)算符 printf("i=%d,*p=%d\n",i,*p); return 0;}

輸出:

i=37,*p=37i=100,*p=100

間接運(yùn)算符*是一元運(yùn)算符,也就是說(shuō):間接運(yùn)算符只是一個(gè)操作數(shù),

double?x,y,*ptr;?//兩個(gè)double變量和一個(gè)double指針ptr?=?&x;???//使得ptr指向x的 地址*ptr?=?7.8;??//?*ptr?等效于變量x本身//?注意如果沒(méi)有ptr=&x為ptr分配有效地址,那么所包含*ptr的語(yǔ)句都是//?沒(méi)有意義的,有可能會(huì)趙成程序崩潰。*ptr?*=2.5;??//將x乘以2.5y?=?*ptr?+?0.5??//將加法x+0.5 的結(jié)果賦值給y

指針與數(shù)組

一維數(shù)組中的每一個(gè)元素都具有相同的數(shù)據(jù)類(lèi)型并分配了相同大小的存儲(chǔ)空間,數(shù)組元素的地址等于該元素相對(duì)數(shù)組首地址的偏移量。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址存放到一個(gè)指針變量當(dāng)中),數(shù)組袁術(shù)的地址就是數(shù)組元素的指針,可以用一個(gè)指針變量指向一個(gè)數(shù)組元素。

int?a[3]?={10,20,30};int *p;p=&a[0];?//把a(bǔ)[0]元素的地址賦值給指針變量,

索引一維數(shù)組方法:

下標(biāo)法(即使數(shù)組名和下標(biāo)值),如a[1] 就是用下標(biāo)法表示數(shù)組的第二個(gè)元素。

地址法(指針?lè)?#xff0c;位移法):即通過(guò)給出地址訪問(wèn)數(shù)據(jù)元素,例如:通過(guò)a+2地址可以找到素組a第三個(gè)元素a[2],

*(a+2)就是a[2].因此,*(a+i)與a[i]等價(jià),都是指數(shù)組a的第i+1個(gè)元素的值

說(shuō)明:用下標(biāo)法訪問(wèn)數(shù)組元素時(shí),是把a(bǔ)[i] 轉(zhuǎn)化成*(a+i)處理的。即先計(jì)算出數(shù)組元素的地址(a+i),然后再找到它指向的存儲(chǔ)空間,讀出或?qū)懭胨闹怠6鴶?shù)組元素用地址法(指針?lè)?#xff0c;位移法)訪問(wèn)時(shí),則不必每次計(jì)算數(shù)組元素的地址,特別是使用P++這樣的操作是比較快的(切記注意下標(biāo)越界)

指針與二維數(shù)組:

在C語(yǔ)言中,一維數(shù)組名代表了該數(shù)組的首地址,也就是該數(shù)組的第一個(gè)元素的起始地址,它是一個(gè)指向數(shù)組第一個(gè)元素的指針,在一維數(shù)組并定義后,編譯系統(tǒng)就會(huì)為該數(shù)組分配存儲(chǔ)空間,其首地址也就確認(rèn)了,所以數(shù)組名實(shí)際上是一個(gè)指針常量。

一般形式

[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型?(*指針變量名)[數(shù)組長(zhǎng)度]int?a[4][3]?={{-1,-2,-3},{-4,-5,-6},{-7,-8,-9},{-10,-11,-12}};int?(a*p)[3];//?指針變量q指向一個(gè)具有3個(gè)int型元素的一維數(shù)組q=a;?//把二維數(shù)組的首地址給q,p指向二維數(shù)組的第一行

二維數(shù)組a中的元素以下8種方法?

//下標(biāo)-下標(biāo)法a[i][j]q[i][j]//下標(biāo)-位移法*(a[i]+j)*q([i]+j)//位移-下標(biāo)法(*(a+i))[j](*(q+i))[j]//位移-位移法*(*(a+i))+j)*(*(q+i))+j)

指向數(shù)組元素的指針變量與指向數(shù)組的指針變量的區(qū)別

#include "stdio.h"int main(){ int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; int i,j,count=1,sum=1; int*p=a[0]; //定義 一個(gè)int*類(lèi)型的指針變量p,p是一級(jí)指針 int (*q)[3] =a; //指向數(shù)組的指針變量q,a是int(*)[3]類(lèi)型的二級(jí)指針 for(;p { printf("%d",*p); } printf("\n------------\n"); for(i=0;i<4;i++){ for(j=0;j<3;j++,count++) { sum=sum+(*(a+i))[j]; if (count%3!=0) printf("a[%d][%d]=%-2d,",i,j,(*(a+i))[j]); //當(dāng)二級(jí)屬為3時(shí),換行 else printf("a[%d][%d]=%d\n",i,j,(*(a+i))[j]); } } for(i=0;j<3;j++){ for (j=0;j<3;j++) { printf("%d+",(*(q+i))[j]); } return 0; }}

輸出:

123456789101112------------a[0][0]=1 ,a[0][1]=2 ,a[0][2]=3a[1][0]=4 ,a[1][1]=5 ,a[1][2]=6a[2][0]=7 ,a[2][1]=8 ,a[2][2]=9a[3][0]=10,a[3][1]=11,a[3][2]=12

指針與字符串

指向字符串的指針變量

定義char?*?指針變量名1[,....,*指針變量名n]//符號(hào)“[]”展示它括起來(lái)的內(nèi)容是可選項(xiàng)初始化char?*?指針變量名1="字符串1"?[,......,*指針變量名n="字符串n"];例如:char * dl = "sunday"上面的語(yǔ)句等價(jià)于char * dl;dl="sunday"

字符數(shù)組的定義

char?數(shù)組名1[下標(biāo)1]?="字符串常量1"[,....,數(shù)組n[下標(biāo)n]="字符串常量n"];例如:char?ch[30]?=?"guangdong China"char?ch[] = "guangdong china"char *ch ="guangdong china"

從鍵盤(pán)中輸入一個(gè)月份號(hào),則程序輸出對(duì)應(yīng)月份的英文名

#include "stdio.h"#include "string.h"char *English_month[]={"illegal month","jannuary","februray","March","April","May","June","July","August","September","October","November","December"};char*month_name(char **q,int n){ if (n<1||n>12) return *q; else return *(q+n);}int main(){ int i; printf("please enter a number of month:"); while (scanf("%d",&i)!=EOF) { printf("It is %s.\n",month_name(English_month,i)); }}

指針與函數(shù):

關(guān)系

  • 指針作為函數(shù)的參數(shù)

  • 函數(shù)返回值是指針

  • 指向函數(shù)的指針

返回指針值的函數(shù)

類(lèi)型標(biāo)識(shí)符?*?函數(shù)指針名?(函數(shù)參數(shù)表)?//?函數(shù)參數(shù)表 表示函數(shù)的形參個(gè)書(shū)和類(lèi)型?char * sort(int a[] ,int n);?//此語(yǔ)句定義了一個(gè)返回指針值的函數(shù)sort(),?//?該函數(shù)返回一個(gè)字符類(lèi)型數(shù)據(jù)的指針,包含兩個(gè)形參?//?包含n個(gè)元素的字符型數(shù)組a,第二個(gè)是整型變量n

空指針有別于其他指向?qū)ο蠡蚝瘮?shù)的有效指針,因此,當(dāng)返回值為指針的函數(shù)出現(xiàn)執(zhí)行失敗的情況時(shí),它通常會(huì)使用空指針作為返回值。標(biāo)準(zhǔn)函數(shù)fopen()正是這樣的一個(gè)例子,如果指定模式下打開(kāi)某文件失敗使,該函數(shù)會(huì)返回一個(gè)空指針

NULL概念:

  • 數(shù)據(jù)庫(kù)中的NULL表示空,連“\0”都沒(méi)有的空

  • 在內(nèi)存中,NULL代表地址為全0的一個(gè)地址,不存儲(chǔ)任何東西。

  • 將定義而未初始化的指針指向NULL,可以有效的防止指針指向未知內(nèi)存空間而造成的不可預(yù)料的錯(cuò)誤。

string.h

strlen

size_t?strlen(const?char?*s);??//const?不變字符串,返回s的字符串長(zhǎng)度(不包括結(jié)尾的0)

案例:

#include "stdio.h"#include "string.h"int main(int argc,char const *argv[]){ char line[] ="Hello"; printf("strlen=%lu\n",strlen(line));????printf("sizeof=%li\n",sizeof(line));??//?計(jì)算了結(jié)尾額/0 return 0;}// 輸出:strlen=5sizeof=6

strcmp:比較字符串

int?strcmp(const?char*s1,const?char*s2)比較兩個(gè)字符串,返回0:s1==s21:?s1?>?s2-1: s1 < s2

strcpy

char?*strcpy(char?*restrict?dst,const?char*restrict?src);把src的字符串拷貝到dstrestrict表明src和他不重疊返回dst為了能鏈起代碼來(lái)

strcat?

char *strcat(char *restrict s1,const char *restrict s2);把s2拷貝到s1的后面,接成一個(gè)長(zhǎng)的字符串返回s1s1必須具有足夠的空間字符串中找字符char?*strchr(const?char*s,int?c);??//?在前面字符串中找c,忽略大小寫(xiě)char?*strrchr(const?char?*s,int c);返回NULL表示沒(méi)有找

指針的應(yīng)用

//交換兩個(gè)變量的值void?swap(int?*pa,int *pb){ int t =*pa; *pa =*pd; *pd=t; }

函數(shù)返回運(yùn)算狀態(tài),結(jié)果通過(guò)指針?lè)祷?/p>

常見(jiàn)的套路是讓函數(shù)返回特殊的不屬于有效范圍內(nèi)的值來(lái)表示出錯(cuò)

-1或0(在文件操作會(huì)看到大量的例子)

但是當(dāng)任何數(shù)值都是有效的結(jié)果時(shí),就的分開(kāi)返回

數(shù)組標(biāo)量是特殊的指針

putchar

int?putchar(int c);向標(biāo)準(zhǔn)輸出寫(xiě)一個(gè)字符返回寫(xiě)了幾個(gè)字符,EOF(-1) 表示寫(xiě)失敗

getchar

int getchar(void);從標(biāo)準(zhǔn)輸入讀入一個(gè)字符返回類(lèi)型是int是為了返回EOF(-1)

實(shí)例;

#include "stdio.h"int main(int argc,char const *argv[]){ int ch; while ((ch=getchar()) != EOF ){ putchar(ch); } printf("EOF\n"); return 0;}

總結(jié)

以上是生活随笔為你收集整理的带参函数_更好的理解Python第五弹函数预处理与指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。