二维数组中的指针含义:
| 表示形式 | 含义 |
|---|---|
| a | 二维数组名,指向一维数组a[0],即0行首地址 |
| a[0],*(a+0),*a | 0行0列元素地址 |
| a+1,&a[1] | 1行首地址 |
| a[1],*(a+1) | 1行0列元素a[1][0]的地址 |
| a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素a[1][2]的地址 |
| (a[1]+2) ,(*(a+1)+2),a[1][2] | 1行2列元素a[1][2]的值 |
1.将字符串a复制给字符串b.
//方法一: #define _CRT_SECURE_NO_WARNINGS #includevoid main() { void copy(char a[], char b[]); char a[] = "I am a teacher."; char b[] = "You are a student."; printf("String a = %snString b = %sn",a,b); copy(a, b); printf("copy string a to string b:n"); printf("String a = %snString b = %s",a,b); } void copy(char a[],char b[]) { int i = 0; while (a[i]!=' ') { b[i] = a[i]; i++; } }
//方法二: #define _CRT_SECURE_NO_WARNINGS #includevoid main() { void copy(char a[], char b[]); char a[] = "I am a teacher."; char b[] = "You are a student."; char *pointer_a, *pointer_b; pointer_a = a; pointer_b = b; printf("String a = %snString b = %sn",a,b); copy(pointer_a, pointer_b); printf("copy string a to string b:n"); printf("String a = %snString b = %s", pointer_a, pointer_b); } void copy(char *pointer_a,char *pointer_b) { int i = 0; while (*(pointer_a+i) !=' ') { *(pointer_b + i) = *(pointer_a + i); i++; } }
2.有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号后,能输出该生的全部成绩.
#define _CRT_SECURE_NO_WARNINGS #includevoid main() { double *select(double(*pointer)[4], int stuId); double stu[][4] = { {78.0,88.5,99.0,100.0},{66.0,74.0,83.5,89.0},{56.0,73.0,81.0,33.0},{100.0,100.0,100.0,100.0} }; int stuId; printf("请输入要查找学生成绩的序号:n"); scanf("%d",&stuId); printf("输出第%d个序号的学生成绩:n",stuId); double *p = select(stu, stuId); for (int i = 0; i < 4;i++) { printf("%5.2ft", *(p + i)); } } double *select(double (*pointer)[4],int stuId) { double *score; score = *(pointer + stuId); return score; }
3.写一个函数,求一个字符串的长度.在main函数中输入字符串,并输出其长度.
#define _CRT_SECURE_NO_WARNINGS #includevoid main() { int len(char *pointer); char str[50]; char *pointer; printf("输入一个字符串:n"); scanf("%s", &str); pointer = str; printf("这段字符串的长度为%d.", len(pointer)); } int len(char *pointer) { int i = 0; while (*(pointer+i)!=' ') { i++; } return i; }
4.有一字符串a,内容为"My name is Li jilin",另一字符串b,内容为"Mr. Zhang Haoling is very happy".写一函数,将字符串b中从第5个到第17个字符(即"Zhang Haoling")复制到字符串a中,取代字符串a中第12个字符以后的字符(即"Li jilin").输出新字符串a.
#define _CRT_SECURE_NO_WARNINGS #include#include void main() { char copy(char *pointer_a, char *pointer_b); char str_a[50] = "My name is Li jilin"; char str_b[50] = "Mr. Zhang Haoling is very happy"; char *pointer_a, *pointer_b; pointer_a = str_a; pointer_b = str_b; copy(pointer_a, pointer_b); printf("输出新字符串a:n%s", pointer_a); } char copy(char *pointer_a,char *pointer_b) { int m_a = 11;//a字符串被替换的起点下标 int n1_b = 4, n2_b = 16;//b字符串被替换的起点和终点下标 while (n1_b<=n2_b) { *(pointer_a + m_a) = *(pointer_b + n1_b); n1_b++; m_a++; } *(pointer_a + m_a) = ' '; }
5.输入一行字符,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少.
#define _CRT_SECURE_NO_WARNINGS #include#include void main() { void total(char *pointer_str, int len); char str[50]; char *pointer_str; printf("请输入一行字符:n"); gets(str); int len = strlen(str); pointer_str = str; total(pointer_str, len); return 0; } void total(char *pointer_str,int len) { int uppercase_Letter = 0, lowercase_Letters = 0, black = 0, number = 0, other = 0; for (int i = 0; i < len;i++) { if (*(pointer_str+i)>='A'&&*(pointer_str + i)<='Z') { uppercase_Letter++; } else if (*(pointer_str + i)>='a'&&*(pointer_str + i)<='z') { lowercase_Letters++; } else if (*(pointer_str + i) == ' ') { black++; } else if (*(pointer_str + i)>='0' && *(pointer_str + i)<='9') { number++; } else { other++; } } printf("这行字符中有%d个大写字母,%d个小写字母,%d个空格,%d个数字,%d个其他字符.",uppercase_Letter,lowercase_Letters,black,number,other); }
6.在主函数中输入10个等长的字符串,用另一函数对它们排序,然后在主函数输出这10个已排好序的字符串.
#define _CRT_SECURE_NO_WARNINGS #include#include void main() { char arr(char (*pointer_str)[6]); char str[10][6]; char (*pointer_str)[6]; for (int i = 0; i < 10;i++) { printf("输入第%d个字符串:n",i+1); scanf("%s",&str[i]); } pointer_str = str; arr(pointer_str); printf("n"); for (int i = 0; i < 10; i++) { printf("%sn",str[i]); } } char arr(char (*pointer_str)[6]) { char temp[6]; char *p; p = temp; for (int i = 0; i < 10;i++) { for (int j = i + 1; j < 10;j++) { if (strcmp(pointer_str[i], pointer_str[j])>0) { strcpy(p,pointer_str[i]); strcpy(pointer_str[i],pointer_str[j]); strcpy(pointer_str[j], p); } } } }
7.将n个数按输入时顺序的逆序排列,用函数实现.
#define _CRT_SECURE_NO_WARNINGS #includevoid main() { void arr(int *pointer_num, int n); int num[20],n; int *pointer_num; printf("您想输入多少个整数?n"); scanf("%d",&n); printf("请输入这些整数:n"); for (int i = 0; i < n;i++) { scanf("%d", &num[i]); } pointer_num = num; arr(pointer_num, n); printf("逆序输出:n"); for (int i = 0; i < n; i++) { printf("%d ",num[i]); } } void arr(int *pointer_num,int n) { int num2[20]; int *pointer; pointer = num2; int mid = n / 2; for (int i = 0; i < mid;i++) { pointer = *(pointer_num + i); *(pointer_num + i) = *(pointer_num + n - i - 1); *(pointer_num + n - i - 1) = pointer; } }
8.写一函数,将一个3X3的整型二维数组转置,即行列互换.
#define _CRT_SECURE_NO_WARNINGS #includevoid main() { void swap(int *pointer); int num[3][3]; int *pointer; printf("输入一个3X3的整型二维数组:n"); for (int i = 0; i < 3;i++) { for (int j = 0; j < 3;j++) { scanf("%d", &num[i][j]); } } pointer = num; swap(pointer); printf("行列互换之后:n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", num[i][j]); } printf("n"); } } void swap(int *pointer) { int temp; for (int i = 0; i < 3; i++) { for (int j = 0; j < i; j++) { temp = *(pointer + 3 * i + j); *(pointer + 3 * i + j) = *(pointer + 3 * j + i); *(pointer + 3 * j + i) = temp; } } }
这里的*(pointer + 3 * j + i)表示第几个元素,从0开始算,下图中一共是8个元素
num[i][j]与num[j][i]互换,用指针的形式表示是第1个元素与第3个元素互换,第2个元素与第6个元素互换,第5个元素与第7个元素互换,即*(pointer + 3 * i + j) = *(pointer + 3 * j + i)



