目录搜索
AlgorithmsAlgorithms(算法)bsearchbsearch_sqsortqsort_sAtomic operationsAtomic operations library(原子操作库)ATOMIC_*_LOCK_FREEatomic_compare_exchange_strongatomic_compare_exchange_strong_explicitatomic_compare_exchange_weakatomic_compare_exchange_weak_explicitatomic_exchangeatomic_exchange_explicitatomic_fetch_addatomic_fetch_add_explicitatomic_fetch_andatomic_fetch_and_explicitatomic_fetch_oratomic_fetch_or_explicitatomic_fetch_subatomic_fetch_sub_explicitatomic_fetch_xoratomic_fetch_xor_explicitatomic_flagatomic_flag_clearatomic_flag_clear_explicitATOMIC_FLAG_INITatomic_flag_test_and_setatomic_flag_test_and_set_explicitatomic_initatomic_is_lock_freeatomic_loadatomic_load_explicitatomic_signal_fenceatomic_storeatomic_store_explicitatomic_thread_fence(线程围栏)ATOMIC_VAR_INITkill_dependencymemory_order(内存排序)C keywordsauto(自动存储)break(跳出循环)C keywords(关键词)casecharconst(常量修饰符)continuedefault(预设运算式)dodouble(双精度浮点型)elseenum(枚举类型)extern(全局变量)float(浮点数)forfortrangoto(goto语句)if(if语句)inline(行内函式)intlong(长整型)register(寄存器变量)restrict( restrict类型限定符)returnshortsignedsizeof(sizeof运算符)static(静态变量)struct(结构体)switch(switch语句)typedef(typedef关键字)union(联合体)unsigned(无符号)void(空类型)volatile(volatile变量)while(while语句)_Alignas_Alignof_Atomic_Bool_Complex_Generic_Imaginary_Noreturn_Static_assert_Thread_localC language#define directive#elif directive#else directive#endif directive#error directive#if directive#ifdef directive#ifndef directive#include directive#line directive#pragma directivealignas(对齐指定符)Alternative operators and tokens(替代运算符和令牌)AnalyzabilityArithmetic operatorsArithmetic typesArray declaration(数组声明)Array initialization(阵列初始化)ASCII ChartAssignment operators(赋值运算符)types(atomic类型限定符)Basic conceptsBit fields(位域)break statementC languageC Operator Precedencecast operatorcharacter constant(字符字面量)Comments(注释符)Comparison operators(比较运算符)compound literals(符合字面量)Conditional inclusion(条件包含)Conformance(一致性)const type qualifier(const 限定符)Constant expressions(常量表达)continue statementDeclarations(声明)do-while loopEnumerations(枚举类型)Escape sequences(转义字符)Expressions(表达式)External and tentative definitions(外部和暂定的定义)File scope(文件范围)floating constant(浮点常量)for loopFunction declarations(函数声明)Function definitions(函数声明)FunctionsGeneric selection泛型选择goto statementIdentifier(标示符)if statementImplicit conversions(隐式转换)Increment/decrement operators(前置/后置操作符)Initialization(初始化)inline function specifier(内联函式)integer constantLifetime(生命期)Logical operators(逻辑运算符)Lookup and name spacesMain function(主函式)Member access operators(会员接入运营商)Memory modelObjects and alignment(字节对齐)Order of evaluation(评估顺序)Other operatorsPhases of translation(翻译阶段)Pointer declarationPreprocessor(预处理)restrict type qualifier(restrict类型限定符)return statementScalar initialization(标量类型初始化)Scope(范围)sizeof operator(sizeof运算符)Statements(陈述)static assert declaration(静态断言声明)Static storage duration(静态存储周期)Storage-class specifiers(存储类说明符)string literals(字符串字面量)Struct and union initialization(结构体与联合体初始化)Struct declaration(结构体声明)switch statementThread storage duration(线程存储时间)TypeType(类型)Typedef declaration(Typedef声明)Undefined behavior(未定义行为)Union declaration(联合体声明)Value categories(值类别)Variadic arguments(变长参数宏)volatile type qualifier(volatile 类型限定符)while loop_Alignof operator_Noreturn function specifierDate and timeasctime(asctime函数)asctime_sclockCLOCKS_PER_SECclock_tctime(ctime函数)ctime_sDate and time utilities(日期和时间库)difftime(计算两个时间的间隔)gmtimegmtime_slocaltimelocaltime_smktime(将时间结构数据转换成经过的秒数的函数)strftime(格式化输出时间函数)timetimespectimespec_gettime_ttmwcsftime(格式化时间宽字符)Dynamic memory managementaligned_allocC memory management library(内存管理库)callocfree(释放动态分配空间的函数)malloc(动态分配内存空间的函数)realloc(重新分配内存空间的函数)Error handlingabort_handler_sassert(断言)constraint_handler_terrno(错误报告)Error handling(错误处理)Error numbers(错误个数)ignore_handler_sset_constraint_handler_sstatic_assertFile input/outputclearerr(清除/复位)fclosefeofferrorfflush(清空文件缓冲区)fgetcfgetposfgetsfgetwcfgetwsFile input/outputfopenfopen_sfprintffprintf_sfputcfputsfputwcfputwsfreadfreopenfreopen_sfscanffscanf_sfseekfsetposftellfwidefwprintffwprintf_sfwritefwscanffwscanf_sgetcgetchargetsgets_sgetwcharperrorprintfprintf_sputcputcharputsputwcputwcharremoverenamerewindscanfscanf_ssetbufsetvbufsnprintfsprintfsscanfsscanf_sswprintfswprintf_sswscanfswscanf_stmpfiletmpfile_stmpnamtmpnam_sungetcungetwcvfprintfvfprintf_svfscanfvfscanf_svfwprintfvfwprintf_svfwscanfvfwscanf_svprintfvprintf_svscanfvscanf_svsnprintfvsprintfvsscanfvsscanf_svswprintfvswprintf_svswscanfvswscanf_svwprintfvwprintf_svwscanfvwscanf_swprintfwprintf_swscanfwscanf_sLocalization supportlconvLC_ALLLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIMElocaleconvLocalization supportsetlocaleNumericsabsacosacosfacoshacoshfacoshlacoslasinasinfasinhasinhfasinhlasinlatanatan2atan2fatan2latanfatanhatanhfatanhlatanlcabscabsfcabslcacoscacosfcacoshcacoshfcacoshlcacoslcargcargfcarglcasincasinfcasinhcasinhfcasinhlcasinlcatancatanfcatanhcatanhfcatanhlcatanlcbrtcbrtfcbrtlccosccosfccoshccoshfccoshlccoslceilceilfceillcexpcexpfcexplcimagcimagfcimaglclogclogfcloglCMPLXCMPLXFCMPLXLCommon mathematical functionscomplexComplex number arithmeticconjconjfconjlcopysigncopysignfcopysignlcoscosfcoshcoshfcoshlcoslcpowcpowfcpowlcprojcprojfcprojlcrealcrealfcreallcsincsinfcsinhcsinhfcsinhlcsinlcsqrtcsqrtfcsqrtlctanctanfctanhctanhfctanhlctanldivdouble_terferfcerfcferfclerfferflexpexp2exp2fexp2lexpfexplexpm1expm1fexpm1lfabsfabsffabslfdimfeclearexceptfegetenvfegetexceptflagfegetroundfeholdexceptferaiseexceptfesetenvfesetexceptflagfesetroundfetestexceptfeupdateenvFE_ALL_EXCEPTFE_DFL_ENVFE_DIVBYZEROFE_DOWNWARDFE_INEXACTFE_INVALIDFE_OVERFLOWFE_TONEARESTFE_TOWARDZEROFE_UNDERFLOWFE_UPWARDFloating-point environmentfloat_tfloorfloorffloorlfmafmaffmalfmaxfmaxffmaxlfminfminffminlfmodfmodffmodlfpclassifyFP_INFINITEFP_NANFP_NORMALFP_SUBNORMALFP_ZEROfrexpfrexpffrexplHUGE_VALHUGE_VALFHUGE_VALLhypothypotfhypotlIilogbilogbfilogblimaginaryimaxabsimaxdivINFINITYisfiniteisgreaterisgreaterequalisinfislessislessequalislessgreaterisnanisnormalisunorderedlabsldexpldexpfldexplldivlgammalgammaflgammalllabslldivllrintllrintfllrintlllroundllroundfllroundlloglog10log10flog10llog1plog1pflog1pllog2log2flog2llogblogbflogbllogflogllrintlrintflrintllroundlroundflroundlMATH_ERREXCEPTmath_errhandlingMATH_ERRNOmodfmodffmodflnanNANnanfnanlnearbyintnearbyintfnearbyintlnextafternextafterfnextafterlnexttowardnexttowardfnexttowardlNumericspowpowfpowlPseudo-random number generationrandRAND_MAXremainderremainderfremainderlremquoremquofremquolrintrintfrintlroundroundfroundlscalblnscalblnfscalblnlscalbnscalbnfscalbnlsignbitsinsinfsinhsinhfsinhlsinlsqrtsqrtfsqrtlsrandtantanftanhtanhftanhltanltgammatgammaftgammaltrunctruncftrunclType-generic math_Complex_I_Imaginary_IProgram supportabortatexitat_quick_exitexitEXIT_FAILUREEXIT_SUCCESSgetenvgetenv_sjmp_buflongjmpProgram support utilitiesquick_exitraisesetjmpSIGABRTSIGFPESIGILLSIGINTsignalSIGSEGVSIGTERMsig_atomic_tSIG_DFLSIG_ERRSIG_IGNsystem_ExitStringsatofatoiatolatollbtowcc16rtombc32rtombchar16_tchar32_tisalnumisalphaisblankiscntrlisdigitisgraphislowerisprintispunctisspaceisupperiswalnumiswalphaiswblankiswcntrliswctypeiswdigitiswgraphiswloweriswprintiswpunctiswspaceiswupperiswxdigitisxdigitmblenmbrlenmbrtoc16mbrtoc32mbrtowcmbsinitmbsrtowcsmbsrtowcs_smbstate_tmbstowcsmbstowcs_smbtowcmemchrmemcmpmemcpymemcpy_smemmovememmove_smemsetmemset_sNull-terminated byte stringsNull-terminated multibyte stringsNull-terminated wide stringsstrcatstrcat_sstrchrstrcmpstrcollstrcpystrcpy_sstrcspnstrerrorstrerrorlen_sstrerror_sStrings librarystrlenstrncatThread supportcall_oncecnd_broadcastcnd_destroycnd_initcnd_signalcnd_timedwaitcnd_waitmtx_destroymtx_initmtx_lockmtx_plainmtx_recursivemtx_timedmtx_timedlockmtx_trylockmtx_unlockonce_flagONCE_FLAG_INITthrd_busythrd_createthrd_currentthrd_detachthrd_equalthrd_errorthrd_exitthrd_jointhrd_nomemthrd_sleepthrd_successthrd_timedoutthrd_yieldThread support librarythread_localtss_createtss_deleteTSS_DTOR_ITERATIONStss_gettss_setType supportBoolean type support libraryFixed width integer typesFLT_EVAL_METHODFLT_ROUNDSmax_align_tNULLNumeric limitsoffsetofptrdiff_tsize_tType supportVariadic functionsVariadic functionsva_argva_copyva_endva_listva_start
文字

指针是一种引用另一种类型的函数或对象的对象类型,可能会添加限定符。指针也可能指什么都没有,它由特殊的空指针值表示。

句法

在指针声明的声明语法中,类型说明符序列指定指向类型(可能是函数或对象类型,可能不完整),声明符的形式如下:

* qualifiers(optional) declarator

(1)


其中声明符可以是标识正在声明的指针的标识符,包括另一个指针声明符(它将指示指向指针的指针):

float *p, **pp; // p is a pointer to float                // pp is a pointer to a pointer to floatint (*fp)(int); // fp is a pointer to function with type int(int)

出现在*和标识符(或其他嵌套声明符)之间的限定符限定了正在声明的指针的类型:

int n;const int * pc = &n; // pc is a non-const pointer to a const int// *pc = 2; // Error: n cannot be changed through p without a castpc = NULL; // OK: pc itself can be changed
 int * const cp = &n; // cp is a const pointer to a non-const int*cp = 2; // OK to change n through cp// cp = NULL; // Error: cp itself cannot be changed
 int * const * pcp = &cp; // non-const pointer to const pointer to non-const int

说明

指针用于间接寻址,这是一种无处不在的编程技术; 它们可用于实现传递引用语义,访问具有动态存储持续时间的对象,以实现“可选”类型(使用空指针值),结构之间的聚合关系,回调(使用指向函数的指针),通用接口(使用指针void)等等。

指向对象

指向对象的指针可以用应用于对象类型表达式(可能不完整)的地址 - 运算符的结果初始化:

int n;int *np = &n; // pointer to intint *const *npp = &np; // non-const pointer to const pointer to non-const int
 int a[2];int (*ap)[2] = &a; // pointer to array of int
 struct S { int n; } s = {1}int* sp = &s.n; // pointer to the int that is a member of s

指针可能作为操作数出现在间接操作符(一元*)上,后者返回标识指向对象的左值:

int n;int* p = &n;     // pointer p is pointing to n*p = 7;         // stores 7 in nprintf("%d\n", *p); // lvalue-to-rvalue conversion reads the value from n

指向结构和联合类型对象的指针也可以作为通过指针运算符访问成员的左侧操作数->

由于数组到指针的隐式转换,可以使用数组类型的表达式初始化指向数组第一个元素的指针:

int a[2];int *p = a; // pointer to a[0]
 int b[3][3];int (*row)[3] = b; // pointer to b[0]

某些加法,减法,复合赋值,增量和减量运算符是为指向数组元素的指针定义的。

在某些情况下,为指向对象的指针定义比较运算符:表示相同地址的两个指针比较相等,两个空指针值相等,指向同一数组元素的指针与这些元素的数组索引相同,以及指向struct成员按照这些成员的声明顺序进行比较。

许多实现还提供了随机起源指针的严格总排序,例如,如果它们被实现为连续(“平坦”)虚拟地址空间内的地址。

指向功能

指向函数的指针可以用函数的地址初始化。由于功能到指针的转换,操作符的地址是可选的:

void f(int);void (*pf1)(int) = &f;void (*pf2)(int) = f; // same as &f

与函数不同,指向函数的指针是对象,因此可以存储在数组中,复制,分配,作为参数传递给其他函数等。

指向函数的指针可以在函数调用操作符的左侧使用; 这会调用指向函数:

#include <stdio.h>int f(int n){    printf("%d\n", n);    return n*n;}int main(void){    int (*p)(int) = f;
    int x = p(7);}

解引用函数指针会得到指向函数的函数指示符:

int f();int (*p)() = f;    // pointer p is pointing to f(*p)(); // function f invoked through the function designatorp();    // function f invoked directly through the pointer

平等比较运算符定义为指向函数的指针(如果指向相同的函数,则它们相等)。

指针无效

指向任何类型的对象的指针都可以隐式转换为指针void(可以是const或volatile限定的),反之亦然:

int n=1, *p=&n;void* pv = p; // int* to void*int* p2 = pv; // void* to int*printf("%d\n", *p2); // prints 1

void指针用于传递未知类型的对象,这在通用接口中很常见:malloc返回值void*qsort期望用户提供的回调接受两个const void*参数。pthread_create需要用户提供的接受和返回的回调void*。在所有情况下,调用者有责任在使用前将指针转换为正确的类型。

空指针

每种类型的指针都有一个特殊的值,称为该类型的空指针值。值为空的指针不指向对象或函数(取消引用空指针是未定义的行为),并将相同类型的所有指针值相等,其值也为

要将指针初始化为空值或将空值赋予现有指针,可以使用空指针常量(NULL或任何其他具有零值的整数常量)。静态初始化还会初始化指向其空值的指针。

空指针可以指示没有对象或可以用来指示其他类型的错误条件。通常,接收指针参数的函数几乎总是需要检查值是否为空,并以不同的方式处理该情况(例如,free在传递空指针时什么也不做)。

注意

尽管任何指向对象的指针都可以转换为指向不同类型对象的指针,但是取消引用指向与对象的声明类型不同的类型的指针几乎总是未定义的行为。细节请参见严格的别名。

可以通过指针访问对象的函数,这些指针不是别名。详情请参阅限制。

(自C99以来)

数组类型的左值表达式在大多数上下文中使用时,会经历到指向数组第一个元素的指针的隐式转换。详情请看阵列。

char *str = "abc"; // "abc" is a char[4] array, str is a pointer to 'a'

指向char的指针通常用于表示字符串。为了表示一个有效的字节串,一个指针必须指向一个字符,它是一个char数组的元素,并且在某个索引处必须有一个char值为零的char大于或等于指针。

上一篇:下一篇: