数组与指针——第二弹

1、通过指针引用数组
一个变量有地址,一个数组中有若干个元素,每个元素都占据着一定的内存空间,他们都有相应的地址。所以指针能指向变量,也能指向数组中的元素。数组元素的指针也就是数组元素的地址。
int a[10]={1,2,3,4,5,6,7,8,9,10}
int *p;
p=&a[0];
将指针指向数组a的0号元素。在C语言中数组名代表数组首元素的地址,所以可以将p=&a[0]改写为:
p=a;
定义时可直接写为:
int *p=a;
它的作用是将数组首元素的地址赋给p(而不是赋给*p)。
2、在引用数组元素时指针的运算
指针指向数组元素时,可对指针进行以下运算
(1)加一个整数,如:p+1
如果p已经指向了数组中的一个元素,那么p+1就表示这个数组中的下一个元素。并不是简单的将p的值加1,而是加上一个数组元素所占的字节数。
(2)减一个整数,如p-1
如果p已经指向了数组中的一个元素,那么p-1就表示这个数组中的上一个元素。同样也是减去一个数组元素所占的字节数。
(3)自加运算++p,p++
前置++,先自增再运算,后置加加,先运算再自增。
(4)自加运算–p,p–
前置–,先自减再运算,后置–,先运算再自减。
(5)两个指针相减
如果指针变量p1,p2都指向同一数组,那么p1-p2就为他们所指向元素的相对距离。
3、通过指针引用数组元素
引用一个数组元素有两种方法:
(1)下标法,如a[i];
(2)指针法,如*(a+i);
eg
下标法输出数组:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[5] = { 2, 3, 1, 6, 5 };
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        printf("%d  ", a[i]);
    }
    system("pause");
    return 0;
}

指针法表示:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[5] = { 2, 3, 1, 6, 5 };
    int i;
    for (i;i<5;i++)
    {
        printf("%d  ", *(a+i));
    }
    system("pause");
    return 0;
}

指针变量指向数组元素:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[5] = { 2, 3, 1, 6, 5 };
    int *p;
    for (p=a; p < (a+5); p++)
    {
        printf("%d  ", *p);
    }
    system("pause");
    return 0;
}

前两种方法的执行效率是相同的,第三种方法比前两种都快,用指针变量直接指向元素。
利用指针引用数组元素,要注意以下几种情况(假设p指向数组的首元素a):
(1)分析:
p++;
*p;
p++使p指向数组下一个元素,然后执行*p,得到下一个元素a[1]的值。
(2)*p++
由于和++是同一优先级,结合方向是从右到左,等价于(p++),先引用p的值,执行*p运算,再进行自增操作。得到了a[0]的值。
(3)*(++)p
先使p加1,在执行*p,得到了a[1]的值。
(4)++(*p)
将指针所指向的元素值加1;若p指向的元素的值为a,那么执行++(*p)后的结果为:b;
(5)将–和++运算符用于指针变量十分有效。可以使指针变量自动向前或者向后移动。
4、指针数组的声明和定义
简单介绍一下声明和定义:定义是分配内存,而声明没有。定义只能出现一次,而声明可以出现多次。
若定义为数组,声明为指针:
char  a[10](文件1)
extern char *a;(文件二)
当声明为指针时,编译器理所应当的认为a是一个指针变量,在32位系统下,占四个字节,这四个字节里保存一个地址,所以它会自动的将a[10]中前四个字节中的内容变为地址。所以这样做肯定是错误的。
若定义为数组,声明为指针:
char *p=”abcdef”;(文件1)
extern char p[];(文件2)
定义中,编译器分配4个字节的空间给给p,同时p中保存了字符串abcdef的首字符的首地址。声明中,编译器认为p是一个数组,其大小为4个字节,数组里面存放的数据是字符型,所以以字符型取出字符串的地址,但这并非是我们要找到的某块内存的地址。

猜你喜欢

转载自blog.csdn.net/ffsiwei/article/details/80148522