表示形式
|
含義
|
a ,&a[0]
|
二維數組名,指向一維數組a[0],即0行首地址
|
a[0],*(a+0),*a,&a[0][0]
|
0行0列首地址
|
a+1,&a[1]
|
1行首地址
|
a[1],*(a+1),&a[1][0]
|
1行0列元素的地址
|
a[1]+2,*(a+1)+2,&a[1][2]
|
1行2列元素的地址
|
*(a[1]+2),*(*(a+1)+2),a[1][2],(*(a+1))[2]
|
1行2列元素
|
**(a+1)
|
1行元素
|
a+i ,&a[i]
|
i行地址
|
a[i], *(a+i)
|
i行0列地址
|
a[i]+j, *(a+i)+j
|
i行j列地址
|
指針的小總結1
本人在學C語言時,發覺指針很難搞,於是作了幾點總結
一.概念區分:
1) 指針和指針變量:
指針:一個變量的地址稱爲該變量的指針。
指針變量:一個變量專門存放另一個變量的地址。(地址是以八進制數保存的 %o)
2)*p++與*(p++):二者相同,先得到p指向變量的值,後再加加。
(*p)++與*p++:前者相當於(a[0])++,即a++。後者同上。
*(p++)與*(++p):後者是先使指針加一,然後再取值。
3) ++*p與(*p)++:前者是++a,後者是a++
++*p與*p++:
(*p)++與*p++
4)實參數組名與形參數組名:
數組名做實參時,代表一個固定的地址(指針常量),但形參數組並不是一個固定的地址值(指針變量)。
5)[ ]是變址運算符:將a[i]先按a+i計算地址,然後找出地址單元的值。
6) int *p;int *p[ ]; int (*p)[ ]; int *p( ); int (*p)( ); int **p的概念區分:
①int (*p)():指向函數的指針
eg: int max(int, int);
int (*p)(int,int);
p=max; /*將函數max的入口地址賦給指針變量p,函數名代表該函數的
c=(*p)(a,b); 入口地址*/
應用:把指針作爲參數傳遞到其他函數,這樣就能夠在被調用的函數中使用實參函數。
二.數組與指針
1)一維數組與指針:
p=a;&a[0]
數組元素地址:
1.p+i = a+i
2.&p[i]=&a[i]
數組元素引用:
1.*(p+i)=*(a+i)
2.p[i]=a[i]
2)二維數組與指針:
定義:
int a[3][4]={{1,2,3,4},{9,11,13,15},{17,19,21,23}}
a是一個數組名。a數組包括3行,即3個元素:a[0],a[1],a[2].而每一個元素又是一個一維數組。因此a代表的是首行首地址。由於a[0],a[1],a[2]又是一維數組名,C語言規定數組名代表數組首元素地址。—— a[0]代表一維數組a[0]中第0列元素的地址,即&a[0][0].
指針賦值:
①p指向數組元素:
int *p;
p=&a[0][0];
p=a[0];
p=*a;
p=*(a+0);
② p是行指針:
int (*p) [n];
p=a;
p=&a[0];
數組地址表示法:
數組元素表示法:
三.經典概念程序題:
a) 指針做函數參數:swap()
1)
#include <stdio.h>
void swap(int *x, int *y) 結果:5,3
{
int t;
t = *x;
*x = *y; //指針所指向的變量的內容發生交換
*y = t;
}
void main ()
{
int a=3,b=5;
swap(&a, &b);
printf(“%d,%d”,a,b);
}
2)
#include <stdio.h>
void swap(int *x, int *y) 結果:3,5
{
int *t;
t = x;
x = y; //地址值進行交換,由於地址也是形參,所以返回
y = t; //主函數時,空間被釋放,而沒有交換a,b值。
}
void main ()
{
int a=3,b=5;
swap(&a, &b);
printf(“%d,%d”,a,b);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.