16、指针与一维数组

指针在很多时候是与数组紧密相关的,因为数组元素的地址通常是连续的,这为指针的操作提供了方便。

1、数组元素的地址关系
一维数组的名字实际上就是指向这个数组的第一个元素的指针,也就是这个数组的起始地址。例如

int A[3]={1,2,3};
int p1=A;
int p2=&A[0];

A 既是数组的名字,也是整个数组 A 的起始地址,也就是第一个数组元素 A[0] 的存放地址。p1==p2
例:使用下标获取数组元素以及通过地址获取数组元素的区别与联系

// 使用下标获取数组元素以及通过地址获取数组元素的区别与联系
#include<iostream>;
using namespace std;
void main()
{
    char words[10];
    int i;
    cout<<"please input the words"<<endl;
    cin>>words;    //只能输入9个字母,输入第10个再回车,会报错。'\0'结束符?
    for(i=0;i<10;i++)
    {
       cout<<words[i]<<" "; //用下标的方法输出
    }
    cout<<endl;

    for(i=0;i<10;i++)
    {
       cout<<*(words+i)<<" "; //用指针的方法输出
    }
    cout<<endl;
}

说明:
- words+i 是第 i+1 个元素存放的地址
- *(words+i) 表示的是第 i+1 个元素的地址所存放的数据值
- * words +i 是对地址 words 进行 * 运算,即取出 words[0] 的值,再加上 i
结果:

2、字符指针

char *pschar;
pschar="information string";

执行以上两行代码时,首先定义一个字符型指针变量,然后找出内存中存放常量字符串“information string” 的起始地址,并把这个地址赋值给指针变量 pschar。这个赋值是允许的,因为字符串常量“information string”本身是有自身的存储空间的,系统为它分配了19个字符的存储空间,并且系统在赋值时,已经将字符串常量转换成起始地址形式
下面这种赋值是不被允许的:

char *pschar;
pschar='a';

例:将一个字符串常量 information 复制到字符数组中,并输出这个字符数组

// 将一个字符串常量 information 复制到字符数组中,并输出这个字符数组
#include<iostream>;
#include<string.h>;
using namespace std;
void main()
{
    char *pchar, Chars[13];
    pchar="information";
    cout<<strlen(pchar)<<endl;
    int i=0;
    while(*pchar!='\0')
    {
        cout<<i<<endl;
        Chars[i]=*pchar;
        pchar++;
        i++;
    }

    cout<<Chars<<endl;
    cout<<Chars[11]<<endl;
    cout<<(Chars[11]=='\0')<<endl;
    cout<<strlen(Chars)<<endl;

    for(pchar=Chars;*pchar!='\0';pchar++)
    {
        cout<<*pchar<<" "; //用指针的方法输出
    }
    cout<<endl;
}

结果:
这里写图片描述
结果分析:
在上面程序中,将information 复制的字符数组 Chars 中时,没有加结束字符‘\0’,所以后面出现乱码且长度不是定义的字符数组的长度。
修改后的程序代码为:

#include<iostream>;
#include<string.h>;
using namespace std;
void main()
{
    char *pchar, Chars[13];
    pchar="information";
    cout<<strlen(pchar)<<endl;
    int i=0;
    while(*pchar!='\0')
    {
        cout<<i<<endl;
        Chars[i]=*pchar;
        pchar++;
        i++;
    }
    Chars[i++]='\0';
    cout<<Chars<<endl;
    cout<<Chars[11]<<endl;
    cout<<(Chars[11]=='\0')<<endl;
    cout<<strlen(Chars)<<endl;
    for(pchar=Chars;*pchar!='\0';pchar++)
    {
        cout<<*pchar<<" "; //用指针的方法输出
    }
    cout<<endl;
}

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值