大家在學習指標的時候可能會有很多的東西讓大家迷惑那麼我用一下幾個小小的實驗程式來給大家解答疑惑:
首先從定義上講指標是一種保存在變數位址的變數。
一元運算子*是間接定址或間接引用的運算子
一元運算符&用於取一個物件的位址,只能應用於記憶體中的物件
也就是說*(間接尋址得到的是一個在內存中存儲的具體的值)
對於指針的實驗
實驗一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@localhost ~]# vim zhizhenshiyan1.c #include<stdio.h> main(void) { int x=1; int *ip; ip=&x; printf("十进制显示d ip=%d\n",ip); printf("十进制显示d *ip=%d\n",*ip); printf("二进制显示x ip=%x\n",ip); printf("二进制显示x *ip=%x\n",*ip); } |
編譯後的結果為
1 2 3 4 5 6 7 8 9 |
[root@localhost ~]# ./a.out 十进制显示d ip=928094692 十进制显示d *ip=1 二进制显示x ip=375199e4 二进制显示x *ip=1 |
指針是一個保存變量地址的變量,在實驗一中,
IP =&X;
ip指向x將x的地址給ip
我們將x的地址賦值給變量ip
我剛剛學習這個的時候在這個地方理解的不是很深刻於是就有了實驗一
從實驗一中我們可以知道直接尋址和簡介尋址的區別,我分別用十進制和二進制打印了直接尋址和簡介尋址的值,
直接尋址則是打印的x在內存中的地址信息,直接尋址得到的數據是一個地址
而間接尋址則是在直接尋址的基礎上建立起來的,簡介尋址的值為所對應的地址中存儲的對象。
實驗二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include<stdio.h> main(void) { int x=1 , y=2; int *ip; printf("int x=1 , y=2;\nint *ip\n"); ip = &x; printf("ip=&x=%d\n",ip); y = *ip; printf("y=*ip=%d\n",y); *ip = 0; printf("*ip=0 x=%d\n",x); printf("&x=%d",&x); } |
———————————————-
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost ~]# ./a.out int x=1 , y=2; int *ip ip=&x=1226821388 y=*ip=1 *ip=0 x=0 &x=1226821388 |
—————————————-
由實驗二我們可以得到以下的信息
首先指針是一個變量,可以進行改變。
1 2 3 4 5 6 7 |
int x=1 , y=2; *ip=0; printf("*ip=0 x=%d\n",x); printf("&x=%d",&x); |
這幾行代碼告訴我們間接尋址賦值則改變的是地址中的對象。通過前後兩次對直接尋址&x的輸出可以得知
====================
實驗三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include<stdio.h> main(void) { int z; int x=1 , y=2 ; char a='!' , b='#' ; int *ip , *ab; char *c ,*d; ip = &x; ab = &y; printf("int z\nint x=1,y=2\nint *ip,*ab;\n*ip=&x *ab=&y\n"); *ip=*ip+10; printf("*ip=*ip+10=%d\n",*ip); z = *ip + *ab; printf("z=*ip+*ab=%d\n",z); } |
編譯後結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost ~]# ./a.out int z int x=1,y=2 int *ip,*ab; *ip=&x *ab=&y *ip=*ip+10=11 z=*ip+*ab=13 |
間接尋址得到的是值,他們的運算為值的運算/
================
實驗四
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> main(void) { char x=1 , y=2; char *ip; ip=&x; *ip=123; printf("%c",*ip); } |
運行後的結果
1 2 3 |
[root@localhost ~]# ./a.out { |
在 asc 碼中123表示的是符號”{“
這個實驗其實很簡單的告訴了我們直接引用和間接引用的各種關係,直接引用則是引用的存放值的地址的值(地址的編碼)在asc碼中123表示的是符號{所以在輸出*ip直接引用123號存儲位置的時候表示的是符號”{“.
=====================
PS:在32位的系統中指針的值可以用 int 值表示甚至可以相互進行一元運算,尤其是指的 asc 碼
本文由 落格博客 原創撰寫:落格博客 » 關於C語言指標的一些學習中的小實驗
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/286.html