当前位置:文档之家› 65指针与数组指针变量即然可以指向变量当然可以指向数

65指针与数组指针变量即然可以指向变量当然可以指向数


例6.6分别用下标法,地址法访问数组元素.
#include<iostream.h> void main( void ) {
int a[5]={1,3,5,7,9}, i ,*p; for(i=0; i<5; i++)
cout<<a[i]<<'\t'; cout<<#43;)
P++ I have 50 Yuan\0 q++
The new string is:I have 5 Yuan;
注意:定义一个数组,在编译时即已分配内存单元,有确定的地址。 而定义一个字符指针变量,只是给指针变量分配内存单元,在其中可 以放一个地址值,也就是说,该指针变量可以指向一个字符型数据, 但如果未对它赋以一个地址值,则它并未具体指向哪一个字符数据。
6.5.4 指针与字符串
字符串是存放在字符数组中的,我们可以定义一个指向字符数组起始 地址的指针----字符指针,通过字符指针的指向来访问字符数组中的字符。
例6.15用字符指针指向一个字符串 void main( void ) {
char string[ ]=“C Language”; char *p; p=string; cout<<string; cout<<p; } 运行结果为:C Language
C Language
可以直接为一个字符指针赋初值: char *p="C Language"; cout<<p;
作用是:使指针变量p指向字符串 的起始地址。千万不要认为“将字 符串中的字符赋给p”。
例6.16 输入一行字符,要求删除指定的字符。
#include<iostream.h>
void del_char(char *p, char x)
#define N 80
{
void del_char(char *, char);
char *q=p;
void main( void )
for(; *p!='\0';p++)
{
if(*p!=x) *q++ = *p;
char c[N], *pt=c, x;
*q ='\0';
cout<<"Enter a string:"; }
cin.getline(pt,50);
cout<<"Enter a char you want
to delete:";
x=cin.get( );
del_char(pt, x);
cout<<"The new string is: "<<c;
}
运行情况如下: Enter a string:I have 50 Yuan; Enter a char you want to delete: 0;
向数组的下一个元素(而不是将p简单加1)。
例如:int a[10], *p; p = a;
则 *p < == > a[0] *(p+1) < == > a[1]; *(p+9)< == >a[9];
p+1所代表的地址实际上是p+1*d, d是该指针类型所占的 字节数。(如整型指针d=2;实型指针d=4,字符型指针 d=1)。 d=sizeof(数组类型)
a[5]=10; 或 *(a+5)=10; 都认为合法,因此,在C++程序中使用数组和指针时应十分小心,避免 出现越界。
6.5.3.要注意指针变量的当前值;
例如:输出a数组的10个元素 #include<iostream.h> void main( void ) {
int *p, i, a[10]; p=a;
for (i=0; i<10; i++) cin>>*p++;
cout<<"\n"; for(i=0; i<10; i++,p++)
cout<<*p<<' '; }
解决办法: 只要在第2个for循 环之前 加上一个赋值语句: p=a;
运行结果: 1,2,3,4,5,6,7,8, 9,0 22153,234,0,0, 30036,25202,11631, 8295,……
6.5 指针与数组
指针变量即然可以指向变量,当然可以指向数组和数组元素。数组的 指针是数组的起始地址.
C++语言中数组名代表数组的起始地址,因此,数组名也就是数组的 指针,数组元素的指针就是数组元素的地址。
6.5.1. 指向数组元素的指针
若一个指针变量指向数组的起始地址,该指针变量称为数组指针。
例:int a[10]; int *p; p=a; p=&a[0];
如:char str[10]; cin>>str; 是可以的。 char *str; cin>>str; 也是合法的。
虽然一般也能运行,但这种方法是危险的。
应当改为: char *a, str[10]; a=str; cin>>a; 先使指针a有确定的指向,也就是使a指向一个数组的开头,然后再输 入字符串到该地址开始的若干单元中。
a代表数组的首地址,是一个常量,其值是不能改变的。
说明: 1、 用地址法访问数组元素的效率比使用下标法的效率高。 原因:使用下标法访问数组元素时,是把a[i]转换成*(a+i)处理的。即先 计算出数组元素的地址a+i, 然后再找到它指向的存储单元,读出或写入 它的值。而用指针变量p指向数组元素时不必每次计算数组元素的地址, 同时p++这样的操作速度快。 2、 C++编译系统不作“下标越界”的检查。 例如: int a[5];
cout<<*(a+i)<<'\t'; cout<<'\n'; for(p=a; p<a+5; p++)
cout<<*p; }
运行结果如下:
1,3,5,7,9 1,3,5,7,9 1,3,5,7,9
注意:不能用如下办法输出a数组中的元素
for(i=0; i<5; i++)
cout<<*a++;
原因:p是指针变量,p的值可以不断变化,因为p的值是地址,因此,p 可以改变其指向。
定义a为包含10个整型数的数组 定义p为指向整型变量的指针变量 将数组a的起始地址赋给指针变量p
p &a[0]
a 1 a[0] a[1]
2 a[2] 3
6.5.2.通过指针引用数组元素
引用一个数组元素可以有两种方法: (1)下标法:如a[i];即指出数组名和下标值,系统就会
找出该元素。 (2)地址法:若p是一个数组指针,C++语言规定p+1指
相关主题