一.地址和指针的概念
一个变量的地址称为该变量的”指针”。指针就是地址,地址就是内存单元的编号。例如,地址2000 是变量 i 的指针。如果有一 个变量专门用来存放另一变量的地址(即指针),则它称为”指针变量”。c语言为了能够表示这种特殊的数据,专门设计一种数据类型 --- 指针类型。
二.变量的指针和指向变量的指针变量
1 定义—个指针变量
C 语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的,必须将它定义为”指针类型”。
基类型 * 指针变量名;
(1) (2) (3)
(1)基类型
基类型说明了 通过指针 找到的空间
a.多大
b.怎么用
就是 指针找到的空间上 所存储的 数据类型
(2) *
只是一个修饰符
用来说明现在定义的变量,不是普通变量,而是指针变量
(3)指针变量名
是个标识符 ,符合标识符命名规则
2 指针变量的引用
(1) &:取地址运算符。
(2) * : 指针运算符(或称“间接访间”运算符),取其指向的内容。
例如,&a 为变量 a 的地址, *p为指针变量 p所指向的存储单元的内容(即 p所指向的变量的值)。
# include <stdio.h>
void main()
{int a,b;
int * pointer_1,* pointer_2;
a=100;b=10;
pointer_1==&a;/*把变量a的地址赋给pointer_1*/
pointer_2=&b;/*把变量b的地址赋给pointer_2*/
printf("%d,%d\n”,a,b);
printf("%d, %d\n", * pointer_1,* pointer_2);
}
3 指针变量作为函数参数
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用 是将一个变量的地址传送到另一个函数中。
eg:
实现一个函数,得到两个整数 和 和 差
int add(int a,int b,int *p1,int *p2)
{
*p1=a+b;
*p2=a-b;
}
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
int p1,p2;
add(a,b,&p1,&p2);
printf("%d %d\n",p1,p2);
return 0;
}
eg:
实现一个函数,找出两个整数中的最大值 和 最小值
int maxmin(int a,int b,int *max,int *min)
{
if(a>b)
{
*max=a;
*min=b;
}else
{ *max=b;
*min=a;
}
}
int main(void)
{
int a,b;
scanf("%d%d",&a,&b);
int max,min;
maxmin(a,b,&max,&min);
printf("max=%d ,min=%d\n",max,min);
return 0;
}
三.数组与指针
本篇只学习指针+整形一维数组
1.指向数组元素的指针
定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。
例如: int a[10]; (定义 a 为包含 10 个整型数据的数组)
int *p;(定义 p 为指向整型变量的指针变量)
p= &a[0];(把 a[0]元素的地址赋给指针变量 p。也就是使 p指向 a 数组的第0号元素)
在定义指针变量时可以对它赋予初值: int * p=&a[0];
2.通过指针引用数组元素
如果 p 的初值为&i[0],则:
(1) p+i和 a+i 就是 a[i]的地址,或者说,它们指向 a数组的第 i个元素。
(2) * (p+i) 或* (a+i)是 p+i 或 a+i 所指向的数组元素,即 a[i]。
(3) 指向数组的指针变量也可以带下标,如 p[i]与 * (p+i) 等价。
eg:输出数组中的全部元素。
# include <stdio. h>
void main()
{
int a[lO];
int i;
for(i=0;i<l0;i++)
scan£("%d", &a[i]);
printf("\n");
for(i=O;i<l0;i++)
printf("%d",a[i]);
printf("\n");
}
3.指针+整形一维数组
eg:写一个函数,打印数组每一项的值
int printfArray(int *p,int len)
{
int i=0;
for(i=0;i<len;++i)
{
printf("a[%d]=%d\n",i,*p++);
}
}
还有另外一种写法
void printfArrayP(int *begin,int *end)//迭代
{
while(begin<=end)
{
printf("%d\n",*begin);
++begin;
}
}
eg:写一个函数,找出两个数的最大值
int FindMax(int *begin,int *end)
{
int max=0;
while(begin<=end)
{
if(*begin>max)
max=*begin;
}
++begin;
}
return max;
//另外一种写法
int FindMaxp(int *p,int len)
{
int max=*p;
int i=0;
for(i=0;i<len;++i)
{
if(*(p+i)>max)
max=*(p+i);
}
return max;
}
eg:选择排序
冒泡排序:
插入排序: