指針參數傳遞


1、指針作為參數傳遞進去的僅僅只是指針的值,而不是指針的地址,或者說只是指針的一份拷貝,例如:

void pointer(int *p)
{
  int a = 11;
  printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);
  *p =11;
  printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);
  p = &a;
  printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);
}

int main()
{
 int b =22;
 int *p = &b;

 printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);
 pointer(p);
 printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);
}

the p is 0xbfd46498 , addr is -1076599652, *p is 22
the p is 0xbfd46498 , addr is -1076599680, *p is 22
the p is 0xbfd46498 , addr is -1076599680, *p is 11
the p is 0xbfd4646c , addr is -1076599680, *p is 11
the p is 0xbfd46498 , addr is -1076599652, *p is 11

1、例子中,指針p的拷貝傳入了方法中(其地址變了,說明是另一變量;值和指向的內存塊數據沒變)

2、將p的拷貝視作p1,p1改變了其所指向的內存塊的值為11

3、p1的值改變為a的地址,即p1指向a,此時p1與p分別指向不同的內存塊了,不會互相影響

4、方法結束,p地址和值沒變(改變的僅僅是p的拷貝p1),但是p所指向的內存塊數據被p1所改變了,故*p為11

總結:傳入的指針僅僅是一個拷貝,方法不會改變原指針的地址、值,但是可能會改變原指針所指向內存塊的數據。

 

值互換的兩種那個方式

void swap(int *a , int *b)//使用指針方式修改指向內存塊的值, 傳值方式
{
  printf("\n a addr : %d , b addr: %d", &a , &b);
int temp = *a; *a = *b; *b = temp; } void swap(int &a , int &b)//使用引用方式,串引用方式 {
  printf("\n a addr : %d , b addr: %d", &a , &b);
int temp = a; a = b; b = temp; } int a=3 , b=5;
 printf("\n a addr : %d , b addr: %d", &a , &b);
printf(
"\n a : %d , b : %d", a , b); swap(&a , &b); printf("\n a : %d , b : %d", a , b); printf("\n a : %d , b : %d", a , b); swap(a , b); printf("\n a : %d , b : %d", a , b);

 a addr : -1076189224 , b addr: -1076189220
 a : 3 , b : 5
 a addr : -1076189248 , b addr: -1076189244
 a : 5 , b : 3
 a : -1076189224 , b : -1076189220
 a addr : -1076189224 , b addr: -1076189220
 a : -1076189224 , b : -1076189220

總結:方法一傳入的是 a、b變量地址的拷貝,也叫傳值;
     方法二傳入的是變量a、b,而不是拷貝(地址相同),又叫傳引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM