第18节 指针与数组

第18节 指针与数组

1.一维数组与指针
►C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。
    
►1. 一维数组的地址 
	► 数组由若干个元素组成,每个元素都有相应的地址,通过取地址运算(&)可以得到每个元素的地址。 
        int a[10]; 
        int *p=&a[0]; //定义指向一维数组元素的指针 
        p=&a[5]; //指向a[5] 

	►C++规定,数组名既代表数组本身,又代表整个数组的地址,还是数组首元素的地址值,即a与第0个元素的地
	址&a[0]相同。例如下面两个语句是是等价的。 
		①p=a; 
		②p=&a[0]; 
	►数组名是一个指针常量,因而它不能出现在左值和某些算术运算中,例如: 
        int a[10], b[10], c[10]; 
        a=b; //错误,a是常量不能出现在左值的位置 
        c=a+b; //错误,a、b是地址值,不允许加法运算 
        a++; //错误,a是常量不能使用++运算2. 指向一维数组的指针变量 
    ► 定义指向一维数组元素的指针变量时,指向类型应该与数组元素类型一致,例如: 
        int a[10], *p1; 
        double f[10], *p2; 
        p1=a; //正确 
        p2=f; //正确 
        p1=f; //错误,指向类型不同不能赋值3. 通过指针访问一维数组 
    ► 由于数组元素的地址是规律性增加的,根据指针算术运算规则,可以利用指针及其运算来访问数组元素。 
    ►设有如下定义: 
        int *p, a[10]={1,2,3,4,5,6,7,8,9,10}; 
        p=a; //p指向数组a 
        p++;

在这里插入图片描述

	设:a是一维数组名,p是指针变量且p=a。根据以上叙述,访问一个数组元素a[i],可以用: 
            ①数组下标法:a[i]; 
            ②指针下标法:p[i]; 
            ③地址引用法:*(a+i); 
            ④指针引用法:*(p+i)。
    【例6.1】用多种方法遍历一维数组元素 
        ①下标法。
            1 #include <iostream> 
            2 using namespace std; 
            3 int main() 
            4 { 
            5 int a[10], i; 
            6 for (i=0;i<10;i++) cin>>a[i]; 
            7 for (i=0;i<10;i++) cout<<a[i]<<" "; 
            8 return 0; 
            9 }
        *****************************************
        ②通过地址间接访问数组元素。 
            1 #include <iostream> 
            2 using namespace std; 
            3 int main() 
            4 { 
            5 		int a[10], i; 
            6 		for (i=0;i<10;i++) cin>>*(a+i); 
            7 		for (i=0;i<10;i++) cout<<*(a+i)<<" "; 
            8 		return 0; 
            9 }
        *****************************************
        ③通过指向数组的指针变量间接访问元素。 
            1 #include <iostream> 
            2 using namespace std; 
            3 int main() 
            4 { 
            5 		int a[10], *p; 
            6 		for (p=a;p<a+10;p++) cin>>*p; 
            7 		for (p=a;p<a+10;p++) cout<<*p<<" "; 
            8 		return 0; 
            9 }4.数组元素访问方法的比较 
    ►(1)使用下标法访问数组元素,程序写法比较直观,能直接知道访问的是第几个元素。 
    ►(2)而使用指针引用法,指针变量直接指向元素,不必每次都重新计算地址,能提高运行效率。 
    ►(3)将自增和自减运算用于指针变量十分有效,可以使指针变量自动向前或向后指向数组的下一个或前一个元素。
2.指针与字符串
►可以利用一个字符型的指针处理字符串,其过程与通过指针访问数组元素相同。使用指针可以简化字符串的处理,是程
序员处理字符串常用的编程方法。
    
►C++允许定义一个字符指针,初始化时指向一个字符串常量,一般形式为: 
    char *p="C Language"; 
    char *p; 
    p="C Language";
►初始化时,p存储了这个字符串首字符地址4000,而不是字符串常量本身,称p指向字符串。
    
►通过字符指针可以访问字符串。例如: 
    char str[]="C Language", *p=str; //p指向字符串的指针 
    cout<<p<<endl; //输出:C Language 
    cout<<p+2<<endl; //输出:Language 
    cout<<&str[7]<<endl; //输出:age 

►通过字符指针遍历字符串。 
	char str[]="C Language", *p=str; //p指向字符串的指针 
	while (*p!='\0') cout<<*p++;
    
【例18.2】指针访问字符串举例 
    1 #include <iostream> 
    2 using namespace std; 
    3 int main() 
    4 { 
    5 		char str[100],*p=str; 
    6 		cin>>str; //输入字符串 
    7 		while (*p) p++; //指针p指向到字符串结束符 
    8 		cout<<"strlen="<<p-str<<endl; 
    9 		return 0; 
   10 } 
    /*
    运行结果: JavaScript ↙ 
             strlen=10
    */

►请记住,指针可以指向数组,使得数组的访问多了一种途径,但指针并不能替代数组来存储大批量数据。 
    char s[100]="Computer"; 
    char *p="Computer"; 
        ►①存储内容不同 
        ►②运算方式不同 
        ►③赋值操作不同
            
►如果字符串数组是一个二维字符数组,例如: 
    char sa[6][7]={"C++","Java","C","PHP", "CSharp","Basic"}; 
►则字符串数组的内存形式为:

在这里插入图片描述

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值