C语言-指针、指针作函数参数
2017-05-10 21:38阅读:
一、指针
&(取地址运算符):单目运算符,返回一个变量的地址
*(指针运算符):单目运算符,返回的是一个地址里面的变量的数据。
&和*具有相同的优先级,自右向左结合。
*只有在声明的是时候表示是指针,其他任何情况单独出现*
都表示指针运算符。
二、什么是指针变量?
1、指针变量的声明: 数据类型 *变量名; int *p;
2、指针变量的赋值:
A、在声明指针的时候赋值:int
*p=&a;
B、先声明,再赋值。 Int *p;
p=&a;
C、
不允许把一个数赋值给指针变量:int *p;
p=50000;(错误的)
3、指针变量的引用:
*变量名;Int *p;
p=&a; *p=a;
三、指针做函数参数
#include
'stdio.h'
void Swap(int
*pa1, int
pb1);
int main()
{
int a, b;
int *pa,*pb; 建议:
遇见指针:1、这个指针的指向类型?
2、这个指针指向哪里?
3、指针自己的类型?
a = 6;
b = 3;
pa = &a;
pb = &b;
Swap(pa, pb);
printf('a=%db=%d', a,
b);
}
void Swap(int
*pa1,
int
*pb1)
{
int temp;
temp = *pa1;
*pa1 =
*pb1;
*pb1 = temp;
}
四、总结
1.首地址:
&a[0][0] a[0] &a[0] a
&a
2.行地址:
1、第0行的地址就是首地址
2、第1行
&a[1][0] a[1]
&a[1]
a+1
3、第2行
&a[2][0] a[2]
&a[2]
a+2
4、第i行
&a[i][0]
a[i]
&a[i] a+i
蓝色的加法就加一维数组的字节数 橙色的加法加数据类型的字节数
3.通过行地址去找到n行m列的元素。
关键是要搞清楚 作为一维数组做判断 还是以整体的二维数组来进行判断
n行m列的元素
(&a[i][j])
(1) *(*(p+i)+j) (作为一维数组做判断)
例1:#include 'stdio.h'
void Input(int (*p)[10],int
m ,int n);
void Output(int (*p)[10],int m ,int n);
int
main()
{
int
a[3][10];
Input(a,3,10);
Output(a,3,10);
return 0;
}
void Input(int (*p)[10],int m ,int n)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
scanf('%d',*(p+i)+j);
}
}
}
void Output(int (*p)[10],int m ,int n)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
printf('%d',*(*(p+i)+j));
}
printf('');
}
}
(2) &p[i*n+j] (矩阵列数为n)
例2:
#include
void Input(int *p,int m ,int n);
void Output(int *p,int m ,int n);
int main()
{
int a[3][4];
Input(*a,3,4);
Output(*a,3,4);
return 0;
}
void Input(int *p,int m ,int n)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
scanf('%d',&p[i*n+j]);
}
}
}
void Output(int *p,int m ,int n)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
printf('%d',p[i*n+j]);
}
printf('');
}
}