码迷,mamicode.com
首页 > 编程语言 > 详细

学C第九天(指针运算、数组指针)

时间:2015-03-29 19:17:03      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

1.指针的加减运算

1)指针+整数  将向后移动sizeof(指针类型)*整数个内存单元

2)指针-整数  将向前移动sizeof(指针类型)*整数个内存单元

3)说明:编译器不会检查移动过后目的地址是否可用,如果移动失误,可能会修改本不应该修改的内存单元,因此,这种运算适宜在数组内进行,或者是动态申请的内存。

4)同类型指针相减  结果为:(指针1的值-指针2的值)/sizeof(指针类型)

#include<stdio.h>

void main()
{
    int a = 10;
    int *p = &a;

    //p+1指向的地址没有初始化,编译器不会检查移动过后目的地址是否可用
    printf("%d", *(p + 1));//-858993460

    int nums[10] = {12,43,65,234,324,45,76,34,86,23};//指针的减法:两者之间相邻元素的个数
    printf("\n%d",&nums[9] - &nums[3]);//6
    getchar();
}

 

2.指针的大小比较

如果两个指针所指向的元素位于同一个数组(或同一块动态申请的内存中),指针的大小比较反映了元素在数组中的先后关系。

3.对指针自增(P++与++p)的理解

#include<stdio.h>

void main()
{
    int nums[10] = {10,44,22,66,11,3,23,111,344,222};
    int *p = nums;
    while (p++ < nums + 2)
    {
        //44 22 
        printf("%d\t", *p);
        //p最开始指向nums的首地址,
        //出了while后的括号之后p向后移动一个元素,指向nums[1],因此输出nums[1]的值
        //接着nums+1<nums+2,出了while后的括号之后p向后移动一个元素,
        //指向nums[2],因此输出nums[2]的值
    }
    //while (++p < nums + 2)
    //{
    //    //44 
    //    printf("\n%d\t", *p);
    //p最开始指向nums的首地址,
    //执行while后的括号之后p向后移动一个元素,指向nums[1],因此输出nums[1]的值
    //接着执行while后的括号之后p向后移动一个元素,而nums+2<nums+2不成立,因此结束
    //}
    getchar();
}

4.优先级问题  ()>++>*

对*p++、(*p)++、++*p、++(*p)的理解

#include<stdio.h>
void main()
{
    double nums[10] = {10,44,22,66,11,3,23,111,344,222};
    double *p = nums;
    //p++是指针类型
    printf("%d\n", sizeof(p++));//4 
    //*p++是double类型
    printf("%d\n", sizeof(*p++));//8 

    //p起初指向nums[0],*p++先取*p的值,出了表达式p指向nums[1]
    printf("%f\n", *p++);//10
    //指针向后移动,并不改变num[0]的数据
    printf("%f\n", nums[0]);//10
    //首先取出*p的值44,接着*p=45,
    printf("%f\n", (*p)++);//44
    //由于*p=45,改变了nums[1]的数据
    printf("%f\n", nums[1]);//45

    //p起初指向nums[1],++p后指向nums[2]
    printf("%f\n", *++p);//22

    //首先取出*p的值22,++22=23
    printf("%f\n", ++*p);//23
    //首先取出*p的值23,++23=24,*p=24
    printf("%f\n", ++(*p));//24
    //*p=24,nums[2]的数据被改变
    printf("%f\n",nums[2]);//24
    getchar();
}

5.指针与数组

1)用指针变量指向数组元素

数组名表示数组的首地址的地址常量,将数组名赋值给指针变量,只是数组的首地址赋值给指针变量,而不是所有元素的地址

#include<stdio.h>
void main()
{
    int num[10];
    int* p = num;//指向数组首地址
    int* p1 = &num[0];//指向数组元素
    //数组名是一个常量指针,实际上就是一个地址
    printf("%x\t%x", num, &num);//fdfec8  fdfec8
    getchar();
}

2)数组元素表示方法

#include<stdio.h>
void main()
{
    int num[4] = {1,2,3,4};
    int* p =num;
    for (int i = 0; i < 4;i++)
    {
        printf("%d\t", num[i]);
        printf("%d\t", *(num+i));
        printf("%d\t", p[i]);
        printf("%d\t", *(p + i));
    }
    getchar();
}

6.数组指针

数组指针(也称行指针)
定义 int (*p)[n];
p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,执行p+1时,p要跨过n个整型数据的长度。

#include<stdio.h>

void main()
{
    //二维数组在内存中也是线性排列
    int a[3][4] = { 34, 234, 65, 23, 54, 82, 99, 55, 22, 654, 23, 12 };
    //p是一个指针,指向一个整型的一维数组,这个一维数组的长度是4
    int(*p)[4] = a;//数组指针(行指针)

    //代表第0行首地址
    printf("%x\n", *p); //18f8dc
    printf("%x\n", &a[0]);//18f8dc
    printf("%x\n", a);//18f8dc

    
    printf("%d\n", sizeof(*p));//16
    printf("%d\n", sizeof(p));//4
    printf("%d\n", sizeof(p[0]));//16
    //*p + 1表示列指针
    printf("%d\n", sizeof(*p + 0));//4

    //p等价a[0]、P+1等价a[1]
    printf("%x\t%x\t%x\n", p, p + 1, p + 2);//1df7b4  1df7c4  1df7d4
    printf("%x\t%x\t%x\n", a[0], a[1], a[2]);//1df7b4  1df7c4  1df7d4

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            //二维数组元素表示发法
            printf("%d\t", p[i][j]);
            printf("%d\t", *(*(p + i) + j));
            printf("%d\t", *(p[i] + j));
            printf("%d\t", a[i][j]);
            printf("%d\t", *(*(a + i) + j));
            printf("%d\t", *(a[i] + j));
        }
        printf("\n");
    }
    getchar();
}

说明:

1)行指针每加1,走一行

a代表第0行首地址

a+i代表第i行首地址

2)列指针每加1,走1列

a[0]代表a[0][0]的地址

a[i]+j代表a[i][j]的地址

3)*(*(a+i)+j)代表a[i][j]元素的值,而*(a+i)+j代表a[i][j]的地址

 

 

 

 

 

 

 

学C第九天(指针运算、数组指针)

标签:

原文地址:http://www.cnblogs.com/ginb/p/4375980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!