程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中和指針相關的四道題目,中和指針四道

C語言中和指針相關的四道題目,中和指針四道

編輯:關於C語言

C語言中和指針相關的四道題目,中和指針四道


例子1.

void fun (int *x , int *y) {
  printf("%d, %d", *x, *y) ;
  *x = 3;
  *y = 4;
}

main()
{
int x = 1, y = 2
fun(&y, &x);
printf("%d, %d", x, y);
}


結果
2, 1
4, 3

注意main在調用fun函數時, y 和x故意寫顛倒了。

 --------------------------------------------------------------

例子2. 

#include <stdio.h>
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

如果在控制台輸入  2 和 5

則輸出結果為 

5, 2

原因: 在調用swap函數時使用了職稱,所以在swap函數內部對p1,p2 所引用的內容值的修改,會影響外面的a和b的值。

 --------------------------------------------------------------

例子3:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
temp = p1;
p1 = p2;
p2 = temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2不同, swap函數中的temp為指針,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.

但最後的打印結果仍為
2,5


原因是:雖然main中調用swap函數時使用了指針傳遞,但swap函數中的所有操作都是:將指針本身的修改,而沒有再次使用*操作符來修改“指針指向的內容值”

---------------------------------------------------------------------

例子4:

#include <stdio.h>
void swap(int *p1, int *p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}

main()
{
int a, b;
int * p1 = &a, *p2 = &b;
scanf(%d %d, p1, p2);
swap(p1, p2);
prinf("%d, %d", *p1, *p2);
}

和2很像。但唯一不同是,temp定義為指針而不是普通變量。看上去似乎應該和2的輸出結果一樣,仍為
2,5 。

但實際運行時編譯器會報錯:非法的內存寫入。

原因是:temp為野指針,並沒有預訂指向哪裡。如果指向系統區,則可能導致操作系統死機。

如果temp在定義後,馬上給一個初始值,就不會有問題了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved