指针高级

//
//  main.c
//  指针高级
//
//  Created by zhangxueming on 15/6/4.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#include <stdio.h>
//指针的数组(指针数组)
//本质是数组, 数组中的每一个元素都是指针变量
//int *p[10];
//p[0]~p[9] 都是一个 int *指针变量

//定义一个一维字符指针数组,并利用不定数量(不多于10)个字符串将其初始化,然后将各字符串输出。
//比如:
//输入
//asdfw uuio fff tyu
//
//输出为
//tyu
//fff
//uuio
//asdfw

//str[0]
//char str[10][100]--> char [100] --> char *

//在内存栽中操作
//int main(int argc, const char * argv[]) {
//    char *ps[10]={NULL};
//    char str[10][100]={};//str[0]   &str[0][0]  char *
//    int cnt=0;
//    for (int i=0; i<10; i++) {
//        ps[i]= str[i];
//        scanf("%s",ps[i]);
//        cnt++;
//        if (getchar()=='
') {
//            break;
//        }
//    }
//    for (int i=0; i<cnt; i++) {
//        printf("%s
", ps[i]);
//    }
//    return 0;
//}
#include <stdlib.h>
//在内存堆中操作
//int main(int argc,const char *argv[])
//{
//    char *ps[10]={NULL};
//    int cnt=0;
//    for (int i=0; i<10; i++) {
//        ps[i]=(char *)malloc(100*sizeof(char));
//        if (!ps[i]) {
//            return -1;
//        }
//        scanf("%s", ps[i]);
//        cnt ++;
//        if (getchar()=='
') {
//            break;
//        }
//    }
//    for (int i=0; i<cnt; i++) {
//        printf("%s
", ps[i]);
//        free(ps[i]);
//        ps[i]=NULL;
//    }
//    return 0;
//}

//利用指针数组求二维数组元素的和

//int sum(int *p[], int len1, int len2)   // 形参 int *p[] ==int **p
//{
//    int sum=0;
//    for (int i=0; i<len1; i++) {
//        for (int j=0; j<len2; j++) {
//            //sum+=p[i][j];// p[i][j] --> *((*(p+i))+j)
//            //sum+=(*(p+i))[j];
//            sum += *((*(p+i))+j);
//        }
//    }
//    return sum;
//}
//
//int main(int argc,const char *argv[])
//{
//    int a[3][2]={1,2,3,4,5,6};
//    
//    int *p[3]={NULL};
//    for (int i=0; i<3; i++) {
//        p[i]=a[i];
//    }
//    printf("sum = %d
", sum(p,3,2));
//    
//    return 0;
//}


//数组的指针(数组指针)
//数组类型的指针,本质是指针变量,数据类型是数组类型的
//int (*p)[3]; --> int (*)[3]   int [3]
//p是一个向有三个元素的一维数组的指针

//&a[0]
//int a[5][4]<==> int (*&a[5])[4] --> int (*)[4]

//a[0]
//int a[5][4]--> int a[0][4] --> int [4] --> int *

//a
//int a[5][4] --> int [5][4] --> int (*)[4]

//&a
//int a[5][4] <==> int (*&a)[5][4] --> int (*)[5][4]

//&a[0][0]  --> int *


//int main(int argc,const char *argv[])
//{
//    //printf("size = %ld
", sizeof(int [5]));
//    
//    int a[5][4]={};
//    int (*p)[4]=a;//int (*)[4]  int *
//    
//    printf("%p
",p);
//    p++;
//    printf("%p
",p);
//    p++;
//    printf("%p
",p);
//    
//    return 0;
//}
//传递一维数组的指针
int sum1(int(*p)[2], int len)// *(int (*p)[2]) --> int [2]
{
    int sum=0;
    for (int i=0; i<len; i++) {
        for (int j=0; j<2; j++) {
            //sum+=p[i][j];
            //sum+= (*(p+i))[j];
            sum+=*(*(p+i)+j);
        }
    }
    return sum;
}
//传递二维数组的指针
int sum2(int (*p)[3][2])//*p  int [3][2] --> int (*)[2]
{
    int sum=0;
    for (int i=0; i<3; i++) {
        for (int j=0; j<2; j++) {
            //sum+= (*p)[i][j];
            sum+= *(*(*p+i)+j);
        }
    }
    return sum;
}
int main(int argc, const char *argv[])
{
    int a[3][2]={1,2,3,4,5,6};
    //printf("sum = %d
", sum1(a,3));
    printf("sum = %d
", sum2(&a));
    
    return 0;
}
原文地址:https://www.cnblogs.com/0515offer/p/4551411.html