CH5-2 指针和数组

5.6 指针数组:数组的每一个元素是指针变量,例如char *str[10];
#include <stdio.h>
#include < string.h>
//字符串排序(quicksort)
//用指针数组来指向各个长短不一的字符串,借用strcmp来,
//当需要改变顺序时,只需改变指针指向即可
#define MAXLENGTH 1000

int getLine( char *line){
         if(gets(line) == NULL) return 0; //char *gets(char *s)读一行到s,直接加'\0'
         else return strlen(line);
}

int readLines( char *ptArray[], int maxLines){
         int length, nlines;
         char *p, line[MAXLENGTH];
        nlines = 0;
         while(length = getLine(line) > 0){
                 if(nlines >= maxLines || (p = ( char*)malloc( sizeof( char)*length)) == NULL)
                         return -1;
                 else{
                        strcpy(p, line); //char *strcpy(char *target, const char *source)
                        ptArray[nlines++] = p;
                }
        }
         return nlines;
}

void writeLines( char *ptArray[], int nlines){
         int i;
         for(i = 0; i < nlines; i++)
                puts(ptArray[i]); //int puts(const char *s)//给stdout上写一行s
}

void writeLines2( char *ptArray[], int nlines){
         while(nlines-- > 0)
                puts(*ptArray++); //ptArray是指针变量,相当于ptArray[0]
}

void swap( char *ptArray[], int i, int j){
         char *tmp; //tmp也必须是一个指针变量,用来记录地址值
        tmp = ptArray[i];
        ptArray[i] = ptArray[j];
        ptArray[j] = tmp;
}

void quickSort( char *ptArray[], int left, int right){
         int i, last;
         if(left >= right) return ;
        swap(ptArray, left, (left + right)/2);
        last = left;
         for(i = left + 1; i <= right; i++){
                 if(strcmp(ptArray[i], ptArray[left]) < 0)
                        swap(ptArray, ++last, i);
        }         //int strcmp(const char *str1, const char *str2)
        swap(ptArray, left, last);
        quickSort(ptArray, left, last - 1);
        quickSort(ptArray, last + 1, right);
}

int main( int argc, char** argv) {
         int maxLines = 5;
         char *ptArray[maxLines]; //每个元素ptArray[i]是一个指向char的指针
         int nlines;
         if((nlines = readLines(ptArray, maxLines)) >= 0){
                quickSort(ptArray, 0, nlines-1);
                writeLines2(ptArray, nlines);
                 return 0;
        } else{
                puts( "error: input too big to sort\n");
                 return 1;
        }
}
5.8 多维数组
#include <stdio.h>
//多维数组
static char dayTable[2][13] = {     //static char //char可用于小无符号整数
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

int dayOfYear( int year, int month, int day){
         int i, ifLeap;
        ifLeap = year%4 == 0 && year%100 != 0 || year%400 == 0;
         for(i = 1; i < month; i++)
                day += dayTable[ifLeap][i];
         return day;
}

void monthDay( int year, int dayOfYear, int *pMonth, int *pDay){
         int i, ifLeap;
        ifLeap = year%4 == 0 && year%100 != 0 || year%400 == 0;
         for(i = 1; dayOfYear > dayTable[ifLeap][i]; i++){
                dayOfYear -= dayTable[ifLeap][i];
        }
        *pMonth = i;
        *pDay = dayOfYear;
}

int main( int argc, char** argv) {
         int year = 1988, month = 2, day = 29;
         int dayYear = dayOfYear(year, month, day);
        printf( "%d\n", dayYear);
         int month2, day2;
        monthDay(1988, 60, &month2, &day2);
        printf( "month = %d, day = %d\n", month2, day2);
         return 0;
}
多维数组做函数形参和实参
#include <stdio.h>
//也可以是void print(int array[][3])或void print(int array[2][3])
//int (*array)[3]与int array[2][3]中,*array与 array[2]的关联
void print( int (*array)[3]){
         int i, j;
         for(i = 0; i < 2; i++){
                 for(j = 0; j < 3; j++)
                        printf( "\t%d", array[i][j]);
                putchar('\n');
        }
}
/* 数组指针 和 指针数组
* int (*array)[3]和int *array[3]的区别
* 前者是指向一个有2行数据的数组的指针,每行有3个元素
* 后者是一个有3个元素的数组,每个元素是一个指针,指针可以指向外部的地址空间,外部空间可以长短不一
*/
int main( int argc, char** argv) {
         int array1[][3] = {{1, 2, 3},{4, 5, 6}};
        print(array1);
         int (*array2)[3];
        array2 = &array1; //也可以是array2 = &array1[0];
        print(array2);
         return 0;
}
5.8 指针数组初始化
#include <stdio.h>
//指针数组初始化
//monthName是一个数组名,每个数组元素monthName[i]是一个指针
char *getMonthName( int n){ //使用static来限定内部数组
         static char *monthName[] = { "Illegal Month", "January", "February",
                                                                 "March", "April", "May", "June",
                                                                 "July", "August", "September", "October",
                                                                 "November", "December"};
         return (n<1 || n>12) ? monthName[0] : monthName[n];
}
int main( int argc, char** argv) {
         int i;
         for(i = 0; i < 13; i++){
                printf( "%d: %s\n", i, getMonthName(i));
        }
         return 0;
}
5.9 指针和多维数组
#include <stdio.h>
#include <stdlib.h>
/*
* 多为数组、数组指针、指针数组三者之间的关系
*/
int main( int argc, char** argv) {
         int a[2][3] = {{1, 2, 3},{4, 5, 6}};
         //b是一个数组的指针,其指向一维数组a[2],每一维有三个元素
         int (*b)[3];
        b = &a; //b = &a[0];
         //c是一个数组,每个元素c[i]是一个int型指针,需要指明另外的地址
         int *c[2];
        c[0] = &a[0];
        c[1] = &a[1];
        
         int i, j;
         for(i = 0; i < 2; i++){
                 for(j = 0; j < 3; j++){
                        printf( "%-8d%-8d%-8d", a[i][j], b[i][j], c[i][j]);
                }
                putchar('\n');
        }
         //注意区别以下 多维数组 和 指针数组 在内存中不同逻辑
         //目前指针数组多用在字符串数组,每个字符串可以不定长度
         char name1[][20] = { "Illegal", "Monday", "Tuesday", "Wednesday",
                                                 "Thursday", "Friday", "Saturday", "Sunday"};
         char *name2[8] = { "Illegal", "Monday", "Tuesday", "Wednesday",
                                             "Thursday", "Friday", "Saturday", "Sunday"};
         int k;
         for(k = 1; k < 8; k++)
                printf( "%8d %10s %10s\n", k, name1[k], name2[k]);
         return (EXIT_SUCCESS);
}
 
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char** argv) {
         char *name[8] = { "Illegal", "Monday", "Tuesday", "Wednesday",
                                         "Thursday", "Friday", "Saturday", "Sunday"};
        printf( "%d %d %d\n", &name, &name[0], name); //name 标记了数组的首地址
        
        printf( "%d %d %d\n", *name, name[0], &name[0][0]); //打印name[0]的内容,name[0]中存放了第0个字符串的首地址
        printf( "%s %s\n", *name, name[0]); //以%s格式,须告知字符串的首地址 来打印字符串
        printf( "%c %c %c\n", (*name)[0], *name[0], name[0][0]); //以格式%c和每个字符串的首地址打印字符
         return (EXIT_SUCCESS);
}
 
 
 

你可能感兴趣的:(职场,休闲)