欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++中指針和引用之相關(guān)問(wèn)題深入研究

 更新時(shí)間:2013年10月08日 09:09:17   作者:  
從內(nèi)存分配上看,程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因?yàn)橐寐暶鲿r(shí)必須初始化,從而指向一個(gè)已經(jīng)存在的對(duì)象。引用不能指向空值

一、基本知識(shí)
指針和引用的聲明方式:
聲明指針: char* pc;
聲明引用: char c = 'A'
   char& rc = c;

它們的區(qū)別:
①?gòu)默F(xiàn)象上看,指針在運(yùn)行時(shí)可以改變其所指向的值,而引用一旦和某個(gè)對(duì)象綁定后就不再改變。這句話(huà)可以理解為:指針可以被重新賦值以指向另一個(gè)不同的對(duì)象。但是引用則總是指向在初始化時(shí)被指定的對(duì)象,以后不能改變,但是指定的對(duì)象其內(nèi)容可以改變。

②從內(nèi)存分配上看,程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因?yàn)橐寐暶鲿r(shí)必須初始化,從而指向一個(gè)已經(jīng)存在的對(duì)象。引用不能指向空值。

③從編譯上看,程序在編譯時(shí)分別將指針和引用添加到符號(hào)表上,符號(hào)表上記錄的是變量名及變量所對(duì)應(yīng)地址。指針變量在符號(hào)表上對(duì)應(yīng)的地址值為指針變量的地址值,而引用在符號(hào)表上對(duì)應(yīng)的地址值為引用對(duì)象的地址值。符號(hào)表生成后就不會(huì)再改,因此指針可以改變指向的對(duì)象(指針變量中的值可以改),而引用對(duì)象不能改。這是使用指針不安全而使用引用安全的主要原因。從某種意義上來(lái)說(shuō)引用可以被認(rèn)為是不能改變的指針。

④不存在指向空值的引用這個(gè)事實(shí)意味著使用引用的代碼效率比使用指針的要高。因?yàn)樵谑褂靡弥安恍枰獪y(cè)試它的合法性。相反,指針則應(yīng)該總是被測(cè)試,防止其為空。

⑤理論上,對(duì)于指針的級(jí)數(shù)沒(méi)有限制,但是引用只能是一級(jí)。

如下:

復(fù)制代碼 代碼如下:

  int** p1; // 合法。指向指針的指針
  int*& p2; // 合法。指向指針的引用
  int&* p3; // 非法。指向引用的指針是非法的
  int&& p4; // 非法。指向引用的引用是非法的

注意上述讀法是從左到右。

程序1:
復(fù)制代碼 代碼如下:

#include "stdio.h"
int main(void)
{
  // 聲明一個(gè)char型指針pc,且讓它指向空值
  char* pc = 0;
  char a = 'a';
  // 聲明一個(gè)引用rc,且讓它引用變量a
  char& rc = a;
  printf("%d, %c\n", pc, rc);

  char *pc2;
  // 聲明一個(gè)指針,但可以不初始化
  pc2 = pc;

  // char& rc2;
  // 上面語(yǔ)句編譯時(shí),會(huì)產(chǎn)生如下錯(cuò)誤:
  // error C2530: 'rc2' : references must be initialized
  // 即,應(yīng)用必須初始化
  // rc = *pc;
  // 上面語(yǔ)句編譯不會(huì)有問(wèn)題,但運(yùn)行時(shí),會(huì)報(bào)如下錯(cuò)誤:
  // "0x00401057"指令引用的"0x00000000"內(nèi)存。該內(nèi)存不能為"read"
  // 說(shuō)明引用在任何情況下,都不能指向空值

  return 0;
}

程序2:
復(fù)制代碼 代碼如下:

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
  string s1("Hello");
  string s2("World");
  // printf("%s\n", s1); 不能用printf輸出s1,而應(yīng)該用cout

  cout << "s1的地址 = "<< &s1 << endl;// &s1 = 0012FF64
  cout << "s2的地址 = "<< &s2 << endl;// &s2 = 0012FF54

  string& rs = s1;   // 1. 定義一個(gè)引用rs,rs引用s1
  cout << "引用rs的地址 = " << &rs << endl;  // &rs = 0012FF64

  string* ps = &s1; //定義一個(gè)指針ps, ps指向s1
  cout << "指針ps的地址 = " << ps << endl;// ps = 0012FF64

  cout << rs << ", " << *ps << endl;  // Hello, Hello
  // 如果沒(méi)有#include <string>,上面的語(yǔ)句在編譯的時(shí)候,會(huì)出現(xiàn)如下錯(cuò)誤:
  // error C2679: binary '<<' : no operator defined which takes a right-
  // hand operand of type 'class std::basic_string<char,struct
  // std::char_traits<char>,class std::allocator<char> >'
  // (or there is no acceptable  conversion)

  rs = s2;  // 2. rs仍舊引用s1, 但是s1現(xiàn)在的值是"World"
  ps = &s2;   // ps現(xiàn)在指向s2

  cout << "引用rs的地址 = " << &rs << endl;  // &rs = 0012FF64 未改變
  cout << "引用rs的值 = " << rs << endl;   // rs = "World" 已改變

  cout << "指針ps的地址 = " << ps << endl;// ps = 0012FF54  已改變
  cout << "指針ps所指地址的內(nèi)容 = " << *ps << endl;  // *ps = World已改變

  cout << "s1的地址 = "<< &s1 << endl;// 3. &s1 = 0012FF64 未改變
  cout << "s1的值 = " << s1 << endl; // 4. s1 = World  已改變

  return 0;
}

可以認(rèn)為:
引用就是變量的別名,在引用初始化的時(shí)候就已經(jīng)確定,以后不能再改變。見(jiàn)程序2的粗體字語(yǔ)句。第1句,聲明了rs引用s1,s1的值為”Hello”,從這以后,rs實(shí)際上就相當(dāng)于變量s1了,或者從更本質(zhì)的意義上來(lái)說(shuō),rs的地址就是初始化時(shí)s1的地址了,以后都不會(huì)再改變。這應(yīng)該比較好理解,比如我們?cè)诔绦蛑卸x了一個(gè)變量a,不管我們?nèi)绾谓oa賦值,但它的地址是不會(huì)改變的;

第2句,rs仍舊指向初始化時(shí)s1的地址,但此處的賦值就相當(dāng)于重新給s1賦值,因此我們從第3句和第4句可以看到,s1的地址并沒(méi)有發(fā)生變化,但是其值已經(jīng)發(fā)生了變化。

二、作為參數(shù)傳遞
利用引用的這個(gè)特性,可以用它作為函數(shù)的傳出參數(shù)。如程序3:

復(fù)制代碼 代碼如下:

#include <iostream>
#include <string>
using namespace std;
int newEvaluation(string& aStr)
{
  string bStr("Hello,");
  aStr = bStr + aStr;

  return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(aStr);
  std::cout << aStr << endl; // 輸出結(jié)果:"Hello, Patrick!"

  return 0;
}

而一般變量,則不能從函數(shù)內(nèi)部傳值出來(lái),比如程序4:
復(fù)制代碼 代碼如下:

#include <iostream>
#include <string>
using namespace std;

int newEvaluation(string aStr)
{
  string bStr("Hello,");
  aStr = bStr + aStr;

  return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(aStr);
  std::cout << aStr << endl; // 輸出結(jié)果:"Patrick!",aStr的值沒(méi)有變化

  return 0;
}

當(dāng)然程序3引用傳遞的方式也可以寫(xiě)成指針傳遞的方式,如程序5:
復(fù)制代碼 代碼如下:

#include <iostream>
#include <string>
using namespace std;

int newEvaluation(string* const aStr)
{
  string bStr("Hello,");
  *aStr = bStr + *aStr;

  return 0;
}

int main(void)
{
  string aStr("Patrick!");
  newEvaluation(&aStr);
  std::cout << aStr << endl; // 輸出結(jié)果:"Hello, Patrick!"

  return 0;
}

注意程序中的陷井,如程序6:
復(fù)制代碼 代碼如下:

#include <iostream.h>
int *pPointer;
void SomeFunction()
{
  int nNumber;
  nNumber = 25;
  //讓指針指向nNumber
  pPointer = &nNumber;
}

void main()
{
  SomeFunction();//為pPointer賦值
  //為什么這里失敗了?為什么沒(méi)有得到25
  cout << "Value of *pPointer: " << *pPointer << endl;
}

這段程序先調(diào)用了SomeFunction函數(shù),創(chuàng)建了個(gè)叫nNumber的變量,接著讓指針pPointer指向了它??墒菃?wèn)題出在哪兒呢?當(dāng)函數(shù)結(jié)束后,nNumber被刪掉了,因?yàn)檫@一個(gè)局部變量。局部變量在定義它的函數(shù)執(zhí)行完后都會(huì)被系統(tǒng)自動(dòng)刪掉。也就是說(shuō)當(dāng)SomeFunction 函數(shù)返回主函數(shù)main()時(shí),這個(gè)變量已經(jīng)被刪掉,但pPointer還指著變量曾經(jīng)用過(guò)的但現(xiàn)在已不屬于這個(gè)程序的區(qū)域。

盡管在SomeFunction中使用所謂的動(dòng)態(tài)分配內(nèi)存。程序7中也存在陷井:
復(fù)制代碼 代碼如下:

#include <iostream.h>
int *pPointer;

void SomeFunction()
{
int intNumber = 25;
// 讓指針指向一個(gè)新的整型
pPointer = new int;
pPointer = &intNumber;
}

void main()
{
SomeFunction();   // 為pPointer賦值
cout<< "Value of *pPointer: " << *pPointer << endl;
delete pPointer;
}

原因也如上面所言,intNumber的作用范圍僅限于SomeFunction中,離開(kāi)了SomeFunction,那么intNumber就不存在了,那么&intNumber即intNumber的地址就變得沒(méi)有意義了,因此,該地址所指向的值是不確定的。如果改為下面的程序就不會(huì)有問(wèn)題了。

程序8:

復(fù)制代碼 代碼如下:

#include <iostream.h>
int *pPointer;

void SomeFunction()
{
int intNumber = 25;
// 讓指針指向一個(gè)新的整型
pPointer = new int(intNumber);
}

void main()
{
SomeFunction();   // 為pPointer賦值
cout<< "Value of *pPointer: " << *pPointer << endl;
delete pPointer;
}

三、指針的指針
前面說(shuō)到,指針是沒(méi)有級(jí)數(shù)限制的。
程序9:
復(fù)制代碼 代碼如下:

#include<stdio.h>
#include<stdlib.h>

void main(void)
{
int i, j;
int a[10], b[3][4], *p1, *p2, **p3;  
for(i = 0; i < 10; i++)
   scanf("%d", &a[i]);  

for(i = 0; i < 3; i++)
   for(j = 0; j < 4; j++)
   scanf("%d", &b[i][j]);

p1 = a;
p3 = &p1;
for(i = 0; i < 10; i++)
   printf("%4d", *(*p3+i));
printf("\n");

for(p1 = a; p1 - a < 10; p1++)
{
   p3 = &p1;
   printf("%4d", **p3);
}
printf("\n");

for(i = 0; i < 3; i++)
{
   p2 = b[i];
   p3 = &p2;
   for(j = 0; j < 4; j++)
   printf("%4d",*(*p3+j));
   printf("\n");
}

for(i = 0; i < 3; i++)
{
   p2 = b[i];
   for(p2 = b[i]; p2-b[i] < 4; p2++)
   {
   p3 = &p2;
   printf("%4d", **p3);
   }
   printf("\n");
}
}

輸出的結(jié)果:
1   2   3   4   5   6   7   8   9   10
1   2   3   4   5   6   7   8   9   10
11  12  13  14
15  16  17  18
19  20  21  22
11  12  13  14
15  16  17  18
19  20  21  22

四、函數(shù)指針和函數(shù)引用
函數(shù)指針是C++最大的優(yōu)點(diǎn)之一。和使用普通指針相比,高級(jí)程序員只要有可能都更愿意使用引用,因?yàn)橐酶菀滋幚硪恍?。然而,?dāng)處理函數(shù)時(shí),函數(shù)引用對(duì)比函數(shù)指針就未必有這個(gè)優(yōu)勢(shì)了?,F(xiàn)有的代碼很少使用函數(shù)引用。下面將向介紹如何函數(shù)指針、如何使用函數(shù)引用以及分別在什么情況下使用它們。

① 函數(shù)指針的例子

復(fù)制代碼 代碼如下:

#include <iostream>
void print(int i)
{
std::cout << i << std::endl;
}

void multiply(int& nDest, int nBy)
{
nDest *= nBy;
}

void print_something()
{
std::cout << "something" << std::endl;
}

int sayHello()
{
std::cout << "Hello, World!" << std::endl;
return 10;
}

int main()
{
void (*pFunction_1)(int);
pFunction_1 = &print;
pFunction_1(1);
// 輸出結(jié)果為1

void (*pFunction_2)(int&, int) = &multiply;
int i = 1;
pFunction_2(i, 10);
std::cout << "i = " << i << std::endl;
// 輸出結(jié)果為10

void (*pFunction_3)();
pFunction_3 = &print_something;
pFunction_3();
// 輸出結(jié)果為something

int (*pFunction_4)();
pFunction_4 = &sayHello;
int a = pFunction_4();
// 輸出結(jié)果為Hello, World!
std::cout << a << std::endl;
// 輸出結(jié)果為10

return 0;
}

② 函數(shù)引用的例子
復(fù)制代碼 代碼如下:

#include <iostream>
void print(int i)
{
std::cout << i << std::endl;
}

void print2(int i)
{
std::cout << i << std::endl;
}

void multiply(int& nDest, int nBy)
{
nDest *= nBy;
}

void print_something()
{
std::cout << "something" << std::endl;
}

int sayHello()
{
std::cout << "Hello, World!" << std::endl;
return 10;
}

 
int main()

// void (&rFunction_1)(int);
// 錯(cuò)誤:未初始化引用!引用必須初始化

void (&rFunction_2)(int) = print;
rFunction_2(1);
// 輸出1

rFunction_2 = print2;
rFunction_2(2);
// 輸出2

void (&rFunction_3)(int&, int) = multiply;
int i = 1;
rFunction_3(i, 10);
std::cout << i << std::endl;
// 輸出10

void (&rFunction_4)() = print_something;
rFunction_4();
// 輸出something

int (&rFunction_5)();
rFunction_5 = sayHello;
int a = rFunction_5();   // 輸出Hello, World!
std::cout << a << std::endl;
// 輸出10

return 0;
}

③ 函數(shù)指針和函數(shù)引用作為函數(shù)參數(shù)
復(fù)制代碼 代碼如下:

#include <iostream>

void print(int i)
{
std::cout << i << std::endl;
}

void print2(int i)
{
std::cout << i * 2 << std::endl;
}

void printSomething()
{
std::cout << "Something" << std::endl;
}

void sayHello()
{
std::cout << "Hello, World!" << std::endl;
}

void call_p_func(void (*func)(int))
{
func(1);
func(2);
func(3);
}

void call_r_func(void (&func)(int))
{
func(1);
func(2);
func(3);
}

void call_p_function(void (*func)())
{
func();
}

int main()
{
std::cout << "函數(shù)指針作為參數(shù)" << std::endl;
call_p_func(&print);
call_p_func(&print2);
call_p_function(&printSomething);
call_p_function(&sayHello);
call_p_function(sayHello);
// 上面兩句對(duì)于某些編譯器來(lái)說(shuō)是一樣的,但是推薦使用前者的寫(xiě)法,
// 這樣可以是程序的可讀性更好一些

std::cout << "函數(shù)引用作為參數(shù)" << std::endl;
call_r_func(print);
call_r_func(print2);

return 0;
}

總結(jié):
函數(shù)指針的聲明使用方式:
<想要指向的函數(shù)之返回類(lèi)型>(*函數(shù)指針的名稱(chēng))<想要指向的函數(shù)之參數(shù)類(lèi)型…>
如要想聲明一個(gè)函數(shù)指針指向以下函數(shù):
復(fù)制代碼 代碼如下:

void print(int i)
{
std::cout << i << std::endl;
}

那么就可以如下操作:
void (*pFunction)(int);
然后如下用函數(shù)的地址給pFunction賦值:
pFunction = &print;
在然后,pFunction就可以和函數(shù)print一樣使用了,比如,
pFunction(1);
等等。

函數(shù)引用的聲明和使用方式:
<欲引用的函數(shù)之返回類(lèi)型>(&函數(shù)引用的名稱(chēng))<欲引用的函數(shù)之參數(shù)類(lèi)型…>=<欲引用的函數(shù)的名稱(chēng)>,至所以如此,是引用在聲明的時(shí)候必須初始化,引用不能指向空值。
如要想聲明一個(gè)函數(shù)引用指向以下函數(shù):
復(fù)制代碼 代碼如下:

void print(int i)
{
std::cout << i << std::endl;
}

那么就可以如下操作:
void (&rFunction)(int)=print;
在然后,rFunction就可以和函數(shù)print一樣使用了,比如,
rFunction(1);
等等。

五、const修飾指針和引用
大致而言,const修飾指針和引用分三種情況,即const修飾指針、const修飾引用和const修飾指針的引用。下面分別討論之。

① const修飾指針
const修飾指針又分為三種情況,即const修飾指針本身、const修飾指針?biāo)傅淖兞浚ɑ驅(qū)ο螅┮约癱onst修飾指針本身和指針?biāo)傅淖兞浚ɑ驅(qū)ο螅?br>
a. const修飾指針本身
在這種情況下,指針本身是常量,不能改變,任何修改指針本身的行為都是非法的,例如:
double pi = 3.1416;
double* const PI = &pi;

double alpha = 3.14;
PI = &alpha;   // 錯(cuò)誤。因?yàn)橹羔楶I是常量,不能再被改變。
*PI = alpha;   // OK。雖然指針PI不能被改變,但指針?biāo)傅淖兞炕蛘邔?duì)象可變。

b. const修飾指針指向的變量(或?qū)ο螅?BR>在這種情況下,指針本身可以改變,但const所修飾的指針?biāo)赶虻膶?duì)象不能被改變,例如:
double pi = 3.1416;
const double* PI = &pi;

double alpha = 3.14;
*PI = alpha;// 錯(cuò)誤。因?yàn)镻I所指向的內(nèi)容是常量,因此*PI不能被改變。
PI = &alpha;// OK。雖然指針?biāo)傅膬?nèi)容不能被改變,但指針PI本身可改變。從而通過(guò)這種方式改變*PI。

c. const修飾指針本身和指針?biāo)赶虻淖兞浚ɑ驅(qū)ο螅?BR>在這種情況下,指針本身和指針指向的變量(或?qū)ο?均不能被改變,例如:
double pi = 3.146;
const double* const PI = &pi;
//double const* const PI = &pi;
cout << "PI = " << PI << endl;
cout << "*PI = " << *PI << endl;

double alpha = 3.14;
//*PI = alpha; // 錯(cuò)誤。因?yàn)镻I所指向的內(nèi)容是常量,因此*PI不能被改變。
//PI = &alpha; // 錯(cuò)誤。因?yàn)橹羔楶I是常量,不能再被改變。

② const修飾引用
const修飾引用沒(méi)有指針修飾指針那么復(fù)雜,只有一種形式。引用本身不能被改變,但所指向的對(duì)象是可以被改變的,見(jiàn)上面“一、基本知識(shí)”。
double pi = 3.1416;
//const double& PI = pi;
double const& PI = pi;  //和上面一句是等價(jià)的
//double& const PI = pi;//有問(wèn)題。很多編譯器會(huì)產(chǎn)生warning
cout << PI << endl;

③ const修飾指針引用
我們用例子來(lái)說(shuō)明。
double pi = 3.14;
const double* pPI = &pi;
//const double*& rPI = &pi; //錯(cuò)誤。不能將double* 轉(zhuǎn)換成const double *&
const double*& rPI = pPI;   //OK。聲明指針引用的正確方法

說(shuō)明:const double*& rPI = &pi; 為什么會(huì)出現(xiàn)錯(cuò)誤呢?我們知道,引用是被引用對(duì)象的別名,正因?yàn)槿绱耍捎趓PI是pPI的別名,因此rPI和pPI的類(lèi)型必須完全一致。從上面的代碼段我們可以看到,rPI的類(lèi)型是const double*,而&pi的類(lèi)型是double*,因此這句程序是錯(cuò)誤的。

下面這段代碼和 ① 中的b中的情形對(duì)應(yīng)(即內(nèi)容不可變,指針可變):
double pi = 3.1416;
double api = 3.14;
const double* pPI = &pi;
const double* pAPI = &api;
const double*& rPI = pPI;
const double*& rAPI = pPI;

*rAPI = api; // 錯(cuò)誤。指針?biāo)赶虻闹挡荒鼙恢苯痈淖?BR>rAPI = pAPI;   // OK。指針本身可以被改變

指針引用的用法還有其它的情形,由于罕用,故此不談及。

相關(guān)文章

  • Qt實(shí)現(xiàn)TCP客戶(hù)端和服務(wù)器通訊程序

    Qt實(shí)現(xiàn)TCP客戶(hù)端和服務(wù)器通訊程序

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP客戶(hù)端和服務(wù)器通訊程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 關(guān)于STL中l(wèi)ist容器的一些總結(jié)

    關(guān)于STL中l(wèi)ist容器的一些總結(jié)

    list就是數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表(根據(jù)sgi stl源代碼),因此它的內(nèi)存空間是不連續(xù)的,通過(guò)指針來(lái)進(jìn)行數(shù)據(jù)的訪問(wèn),這個(gè)特點(diǎn)使得它的隨即存取變的非常沒(méi)有效率,因此它沒(méi)有提供[]操作符的重載
    2013-09-09
  • C++之CNoTrackObject類(lèi)和new delete操作符的重載實(shí)例

    C++之CNoTrackObject類(lèi)和new delete操作符的重載實(shí)例

    這篇文章主要介紹了C++之CNoTrackObject類(lèi)和new delete操作符的重載實(shí)例,是C++程序設(shè)計(jì)中比較重要的概念,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符

    C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符

    這篇文章主要介紹了C語(yǔ)言如何在字符數(shù)組中插入一個(gè)字符,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)

    C++ OpenCV學(xué)習(xí)之圖像像素值統(tǒng)計(jì)

    在圖像分析的時(shí)候,我們經(jīng)常需要對(duì)單通道圖像的像素進(jìn)行統(tǒng)計(jì)。本文將主要介紹利用C++ OpenCV實(shí)現(xiàn)的圖像像素值統(tǒng)計(jì)的幾種方法,需要的可以參考一下
    2022-01-01
  • C與C++ 無(wú)參函數(shù)的區(qū)別解析

    C與C++ 無(wú)參函數(shù)的區(qū)別解析

    在《C++ 編程思想》:“關(guān)于無(wú)參函數(shù)聲明,C與C++有很大的差別。在C語(yǔ)言中,聲明int fun1(),意味著一個(gè)可以有任意數(shù)目和類(lèi)型的函數(shù);而在C++中,指的卻是一個(gè)沒(méi)有參數(shù)的函數(shù)”
    2013-07-07
  • C++日期類(lèi)(Date)實(shí)現(xiàn)的示例代碼

    C++日期類(lèi)(Date)實(shí)現(xiàn)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++語(yǔ)言實(shí)現(xiàn)日期類(lèi)(Date),可以實(shí)現(xiàn)確定某年某月有多少天、打印日期等功能,感興趣的可以了解一下
    2022-07-07
  • C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    在C語(yǔ)言的程序中包括各種以符號(hào)#開(kāi)頭的編譯指令,這些指令稱(chēng)為預(yù)處理命令。預(yù)處理命令屬于C語(yǔ)言編譯器,而不是C語(yǔ)言的組成部分,通過(guò)預(yù)處理命令可擴(kuò)展C語(yǔ)言程序設(shè)計(jì)的環(huán)境
    2022-08-08
  • C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹(shù))

    C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(108.將有序數(shù)組轉(zhuǎn)為二叉搜索樹(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的原理是通過(guò) malloc() 函數(shù)申請(qǐng)一塊連續(xù)的內(nèi)存空間,并返回其地址,通過(guò) free() 函數(shù)釋放該內(nèi)存空間。實(shí)現(xiàn)方法是通過(guò)在程序運(yùn)行時(shí)動(dòng)態(tài)地管理內(nèi)存,即在需要內(nèi)存時(shí)申請(qǐng),不需要時(shí)釋放,避免了靜態(tài)內(nèi)存分配的浪費(fèi)和不足
    2023-04-04

最新評(píng)論