一、指针
&(取地址运算符):单目运算符,返回一个变量的地址
*(指针运算符):单目运算符,返回的是一个地址里面的变量的数据。
&和*具有相同的优先级,自右向左结合。
*只有在声明的是时候表示是指针,其他任何情况单独出现*都表示指针运算符。
二、什么是指针变量?
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"
voidSwap(int*pa1,
intpb1);
intmain()
{
inta,
b;
int*pa,*pb;
建议:
遇见指针:1、这个指针的指向类型?2、这个指针指向哪里?3、指针自己的类型?
a = 6;
b = 3;
pa = &a;
pb = &b;
Swap(pa, pb);
printf("a=%d\nb=%d\n",
a, b);
}
voidSwap(int*pa1,
int*pb1)
{
inttemp;
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("\n");
}
}
(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("\n");
}
}