一、指针变量的定义及初始化
指针:存放变量的地址的数据类型
int a = 5;
int *p; //p是一个指针变量,它指向一个整型变量
p = &a; //p保存了变量a的地址
printf("%d",*p); //*p等价于a,取得变量a的值,对*p所做的修改同样生效于a
注:指针变量未初始化意味着指针变量的值是一个随机值,我们无法预测它会指向哪里,将会给系统带来潜在的危险,甚至导致系统崩溃,为避免忘初始化所带来的危险,在定义时及初始化为NULL,其输出运行结果为0
按值调用与按地址调用的区别
//按值调用
#include <stdio.h>
void fun(int a){
a = 10;
printf("a = %d\n",a);
}
int main(){
int a = 1;
printf("a = %d\n",a);
fun(a);
return 0;
}
/*
运行结果:
a = 1
a = 1
*/
按地址调用:
传给函数形参的值只是函数调用语句中实参的副本,因此按值调用的方法不能在被调函数中改变调用语句中实参值。
//按地址调用
#include <stdio.h>
void fun(int *a){
*a = 10;
printf("a = %d\n",a);
}
int main(){
int a = 1;
printf("a = %d\n",a);
fun(&a);
return 0;
}
/*
运行结果:
a = 1
a = 10
*/
按地址调用:
传给被调函数的值不是变量的值,而是变量的地址,通过向被调函数传递某个变量的地址值可以在被调函数中修改主调函数中这个变量的值
二、函数指针
函数指针就是指向函数的指针,指向函数的指针变量中存储的是一个函数在内存中的入口地址
三、指针和数组
数组元素在内存中是连续存放的,C语言中的数组名具有特殊的含义,它代表存放数组元素的连续存储空间的首地址,即指向数组中第一个元素的指针常量,
数组元素既可以用下标法也可以用指针法来引用:
//下标法引用
#include <stdio.h>
int mian(){
int a[5] , i;
printf("输入五个数字:");
for(i = 0; i < 5; i++)
scanf("%d",&a[i]); //下标法引用
for(i = 0; i < 5; i++)
printf("%d",a[i]);
return 0;
}
/*
数组名a代表数组的首地址,即元素a[0]的地址&a[0],所以表达式a+1表示首地址后的下一个元素地址。
即表达式a+i代表数组下标为i的元素a[i]的地址&a[i]
故也可通过间接寻址引用数组中的元素 ,即*(a+i)表示取出首地址元素后第i个元素的内容,即下标为i的元素a[i]
*/
#include <stdio.h>
int mian(){
int a[5] , i;
printf("输入五个数字:");
for(i = 0; i < 5; i++)
scanf("%d",a+i);
for(i = 0; i < 5; i++)
printf("%d",*(a+i));
return 0;
}
//指针法引用
/*
p+1并不改变当前指向。p仍然指向原来指向的元素
p++相当于执行p = p + sizeof(p的基类型),因此改变了指针p的指向,即指向了下一个元素
*/
#include <stdio.h>
int mian(){
int a[5] , *i;
printf("输入五个数字:");
for(i = a; p < a+5; p++)
scanf("%d",p); //指针法引用
for(i = a; p < a+5; p++)
printf("%d",*p);
return 0;
}
/*
指针也可用下标表示法
*/
#include <stdio.h>
int mian(){
int a[5] , *i = NULL , j;
printf("输入五个数字:");
i = a; //使指针i指向数组首地址
for(j = 0; j < 5; j++)
scanf("%d",&p[j]);
i = a; //在再次循环前使指针i指向数组首地址
for(j = 0; j < 5; j++)
printf("%d",p[j]);
return 0;
}
指针和二维数组的关系
在C语言中可将一个二维数组看作由若干个一维数组构成
int a[3][4];
首先,可将二维数组a看作由a[0], a[1], a[2]三个元素组成的一维数组的数组名
由一维数组与指针的关系得,a+i表示元素a[i]的地址&a[i],注 这里所谓的元素事实上仍然是个地址,而非具体数值
其次,再将a[0], a[1], a[2]三个元素分别看成是由四个整型元素组成的一维数组的数组名
eg:a[0]可看成由元素a[0][0], a[0][1], a[0][2], a[0][3]这四个整型元素组成的一维数组的数组名
通过二维数组的行指针和列指针来引用二维数组的元素
行指针:
int (*p)[4]; 说明定义了一个可指向含有四个元素的一维整型数组的指针变量,4表示行指针所指一维数组的长度,不可省略
地址:*(p+i)+j
元素:*(*(p+i)+j)
列指针:
int *p;
地址:&p[i*n+j]
元素:p[i*n+j]