指针含义
变量在内存中的地址。通过地址找到变量所在的内存空间。
例如:int a =10
;
a
表示变量的值,该值为10,&a
表示该变量的内存地址。
“直接访问”和“间接访问”
直接访问:直接从某个变量的地址空间中访问该内存空间对应的内存。
间接访问:某个变量i
的地址存放到另一个变量j
中,通过访问变量j
找到变量i
的地址,从而访问变量i的值。
指针变量
用来专门存放另一个变量地址的变量。
整型变量、实型变量--->值
指针变量中存放的是另一个变量的内存地址。
指针变量的一般形式
类型名 *指针变量名;
例如:int *p
;
int
表示指针变量的类型,指针变量的类型用来存放另一个int类型变量的地址。也就是指针变量p
指向另一个int类型的变量。
*
表示该变量为指针变量。
p
表示变量的地址。
*p
表示该地址指向的值。
#include<stdio.h>
int main(){
int a=20;
int *p,*q; //int 类型
p=&a; //p的地址=a的地址
q=&a; //q的地址=a的地址
*p=30; //p的地址指向的值=30
printf("a(addr)=%dn",&a); //a的地址
printf("p=%dn",p); //p的地址
printf("a=%dn",a); //a的值
printf("*p=%dn",*p); //指针变量p的值
printf("q=%dn",*q); //指针变量q的值
return 0;
}
注意知识点:
在定义指针变量时,必须指定指针变量的类型,并且一个指针变量只能指向同类型的变量,不能一会指向整型,一会指向实数类型变量。
代码语言:javascript复制int main(){
int a=100;
float b=12.3f;
int *p;
p=&b; //错误!!!
return 0;
}
在定义指针变量时,要给指针变量赋初值,也就是将这个指针变量指向一个确定的变量才能对指针变量指向的值进行操作。
代码语言:javascript复制int main(){
int a = 200;
int *p;
*p = 100;//野指针,错误
printf("%d",*p);
return 0;
}
不能对指针变量直接赋一个常量内存地址。
代码语言:javascript复制int main(){
int a = 200;
int *p;
p=1000;//错误
printf("%d",*p);
return 0;
}
不能将一个变量的地址赋值给一个指针所指向的值。
代码语言:javascript复制int main(){
int a = 200;
int *p;
*p = &a;//错误
printf("%d",*p);
return 0;
}
特例:
代码语言:javascript复制int main(){
int a = 200;
//int* p= &a;
int *p;
p = &a;
printf("%d",*p);
return 0;
}
指针变量作为函数的参数
当函数的形式参数为指针类型时,作用是将一个变量的地址传递到函数中。
例题:输入a和b两个数,按照由大到小的顺序输出a和b。(用函数和指针实现)
代码语言:javascript复制#include<stdio.h>
int main(){
void swap(int *,int *);
int a=10,b=20;
if(a<b)swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
如果函数的形式参数为int a[]
或int *a
,形式参数a是用来接收地址的,如果函数的形式参数为int a,形参a是用来接收值的。
#include<stdio.h>
int main(){
void swap(int a[10000],int b[5000]);
int a=10,b=20;
if(a<b)swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
void swap(int a[],int b[]){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
总结:
- 函数可以通过
return
返回一个值。 - 如果在定义函数时,形参为
int *a
或int a[]
,可以“返回”该指针指向的值。