指针
一 指针和指针变量
1 指针变量的初始化
一般形式:[存储类型] 数据类型 * 指针名 = 初始地址值;
例: int i; // i必须先定义
int *P= &i;
例: int i;
int *p = &i;
int *q = p;
例: main()
{ int i;
static int *p = &i;
.......
}
2 指针变量的一般使用
1 给指针变量赋值。
格式 指针变量 = 地址型表达式
2 直接使用指针变量
格式 指针变了名
3 通过指针变量引用所指向的变量
格式 *指针变量名
3 指针的基本运算
1 取地址运算符 &
取地址运算符 “&” 的功能是取变量的地址
指针变量的引用
例 通过指针变量访问整型变量
include <stdio.h>
void main( )
{
int a, b, *p1, p2 ;
a=100; b=10;
p1=&a; p2=&b;
printf(“a=%d, b=%d\ n”,a, b);
printf(“ p1=%d, * p2=%d\ n”, *p1, * p2);
printf(“&a=%x,& b=%x\ n”,&a, &b);
printf(“p1=%x, p2=%x\ n”, p1, p2);
printf(“& p1=%x, &p2=%x\ n”, &p1, & p2);
}
运行结果:
a=100, b=10
*p1=100, *p2=10
&a=ffd4, &b=ffd6
p1=ffd4, p2=ffd6
&p1=ffd8, &p2=ffda
指针变量作为函数参数——地址传递
❖特点:共享内存,“双向”传递
例 将数从大到小输出
include <stdio.h>
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
void main()
{ int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
printf("\n%d,%d\n",a,b);
}
运行结果:
5 , 9
5 , 9
例 将数从大到小输出
(使用指针变量作函数参数)
include <stdio.h>
void main()
{
void swap(int *p1, int *p2);
int a,b;
int pointer_1,pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a; pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);
printf("\n%d,%d\n",a,b);}
void swap(int *p1, int p2)
{ int temp;
temp=p1;
p1=p2;
*p2=temp;
}
二 指针和数组
例子1
int *p;
int a[10];
p = a;
例子2
int a[10];
int *p=a;
比如访问 a[5] = p[5] *[p+5] *[a+5]
指针和一维数组:
数组的指针是指向数组在内存的起始地址,数组元素的指针是指向数组元素在内
存的起始地址。
若将指针变量指向一维数组,可以采用以下两种方法:
1、在数据定义语句中用赋初值的方式,即*指针变量=数组名。
2、在程序中用赋值的方式,即指针变量=数组名;。
若将指针变量指向一维数组元素,可以采用以下两种方法:
1、在数据定义语句中用赋初值的方式,即*指针变量=&数组名[下标]。
2、在程序中用赋值的方式,即指针变量=&数组名[下标];。
当指针变量指向一维数组,利用指针变量引用一维数组元素的方法如下:
1、引用下标为0的数组元素 *(指针变量+0)或 *指针变量 或 指针变量[0]
2、引用下标为i的数组元素 *(指针变量+i) 或 指针变量[i]
当指针变量指向下标为i的一维数组元素时,利用指针变量引用数组元素的方法 如下:
1、引用下标为i的数组元素 *(指针变量+0) 或 *指针变量
2、引用下标为i-k的数组元素 *(指针变量-k)
3、引用下标为i+k的数组元素 *(指针变量+k)
当指针变量指向一维数组时,引用下标为i的一维数组元素可以采用四种方法:
1、(指针变量+i)
2、(数组名+i)
3、指针变量[i]
4、数组名[i]
指向数组元素的指针
例: int a[10];
int *p;
p = &a[0]; 或 p=a;
定义指针变量时赋初值 :
例: int *p = &a[0];
int *p = a;
用
在数组定义语句的时候
int *p = &a[2];
例:int *p=&a[0];
int *p=a;
如
int i, *p;
p=1000; (错)
i=p; (错)
不能把一个整数p,也不能把p的值整型变量
1 通过指针引用数组元素
如果: int a[10];
int p;
p=&a[1]; / p指向数组元素a[1] */
则: p=1
表示对p当前指向的数组元素a[1]赋予值1
而:p+1指向同一数组的下一个元素a[2]。
p的值(地址)加了2个字节,p+1=p+1×d(整型,d=2;
实型,d=4;字符型d=1)指针变量所指数组元素的地址的计算,
与数组数据类型有关。
设 p=&a[0]
则 ⑴ p+i和a+i就是a[i]的地址a+i×d
⑵ (p+i)或(a+i)是p+i或a+i指向的数组元素a[i]
⑶ 指向数组的指针变量可带下标,p[i]与(p+i)等价
❖一级指针变量与一维数组的关系
int *p 与 int q[10]
⚫数组名是指针(地址)常量
⚫ p=q; p+i 是q[i]的地址
⚫数组元素的表示方法:下标法和指针法,
即:若p=q,
则:p[i] q[i] *(p+i) *(q+i)
⚫形参数组实质上是指针变量。
即:int q[ ] int *q
⚫在定义指针变量(不是形参)时,不能把int p 写成int p[];
⚫系统只给p分配能保存一个指针值的内存区(一般2字节);而
给q分配210字节的内存区
例 用三种方法输出数组中全部元素的值
⑵ 用数组名:
include <stdio.h>
void main()
{int a[10];
int i;
for(i=0; i<10; i++)
scanf("%d",&a[i]);
printf("\n");
for(i=0; i<10; i++)
printf("%d",*(a+i));}
⑶ 指针法:
include <stdio.h>
void main()
{int a[10];
int p,i;
for(i=0; i<10; i++)
scanf("%d",&a[i]);
printf("\n");
for(p=a; p<(a+10); p++)
printf("%d",p );}
⑷ 指针法和指针下标:
include <stdio.h>
void main()
{int a[10];
int p,i;
for(i=0; i<10; i++)
scanf("%d",&a[i]);
printf("\n");
for(p=a,i=0; i<10; i++)
printf("%d",(p+i));}
使用指针变量时要注意的问题:
⑴ p++: 合法,因为p是指针变量,++只能用于变量。
a++: 不合法,因为a是数组名,其值是数组元素的
首地址,是常量,程序运行期间值固定不变。
⑵ 指针变量使用时要注意当前值。
三 指针和字符串
字符串的表示形式
字符串: 用双引号括起的一串字符。
可赋给字符型的数组或指针变量,
可通过字符型数组名或字符型指针变量输出。
❖用字符数组实现
例 定义字符数组
include <stdio.h>
void main( )
{ char string[]=“I love China!”;
printf("%s\n",string);
printf("%s\n",string+7);
}
用下标法存取字符串中的字符
例 将字符串a复制为字符串b
include<tdio.h>
void main()
{
char a[] = "I am boy.",b[20];
int i;
for(i=0;*(a+i)!='\0';i++)
(b+i)=(a+i);
*(b+i)='\n';
printf("string a is: %s\n",a);
printf("string b is:");
for (i = 0;b[i]!='\n';i++)
printf("%c",b[i]);
printf("\n");
}
注意: 这里
string[4] 等价于 *(string+4)
总结 字符指针变量的赋值和字符数组的赋值方式
字符指针变量赋值
char *cp; cp = "i love xuexi"; 等价于 char *cp = "i love xuexi";
字符数组的赋值
char str[20]; str[1] = "China"; 或者 char str[] = {"China"};
四 指针和函数
五 指针数组
六 指针的程序设计举例

浙公网安备 33010602011771号