目录
一、数组名的理解
除sizeof(arr)和&arr代表整个数组以外,arr等价于&arr[0]。
//对数组名的理解
#include <stdio.h>
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("sizeof(arr)=%zd\n", sizeof(arr));//结果为40,取的是整个数组
printf("&arr移动前 =%p\n", &arr);//取的是arr[0]的地址
printf("&arr移动后 =%p\n", &arr+1);//移动4*10个字节,表明&arr取的是整个数组
printf("arr移动前 =%p\n", arr);//取的是arr[0]的地址
printf("arr移动后 =%p\n", arr+1);//移动4个字节,表明arr等价于&arr[0]
}
二、使用指针访问数组
arr[a]等价于*(arr+i),数组传参时可以写成数组的形式(本质时指针)。
#include <stdio.h>
int main() {
int arr[4] = { 1,2,3,4 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for(i = 0; i < sz; i++) {
scanf("%d", arr+i);//arr+i等价于&arr[0]+i
}
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);//arr[i]等价于*(arr+i)
}
}
三、一维数组传参的本质
传的是一维数组首元素的地址。
#define _CRT_SECURE_NO_WARNINGS 1
//一维数组传参的实质
//用函数打印数组内容
#include <stdio.h>
void Print(int* p, int sz) {
int i = 0;
for (i = 0; i < sz; i++) {//这里用指针p接收&arr[0]
printf("%d ", *(p+i));
}
}
int main() {
int arr[4] = { 1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
Pr
四、冒泡排序
相邻元素比较,在一次次遍历中排出正确顺序。
void Print(int sz, int arr[10]);
void Bubble(int sz, int arr[10]);
#include <stdio.h>
int main() {
int arr[] = { 7,3,10,2,5,1,8,4,9, };
int sz = sizeof(arr) / sizeof(arr[0]);
Bubble(sz,arr);
Print(sz, arr);
}
void Bubble(int sz, int arr[10]) {
int i = 0;
for (i = 0; i <= sz; i++) {
int i = 0;
for (i = 0; i < sz - 1; i++) {
int j = 0;
int flag = 0;
for (j = 0; j < sz - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag == 0;
int c = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = c;
}if (1 == flag) {
break;
}
}
}
}
}
void Print(int sz,int arr[10]) {
int i = 0;
for (i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
}
五、二级指针
一级指针:存放普通变量的地址。
二级指针:存放一级指针的地址。
三级指针…………
#define _CRT_SECURE_NO_WARNINGS 1
//二级指针
#include <stdio.h>
int main() {
int a = 8;
int* p = &a;
int** pp = &p;//二级指针的使用,pp变量指针的类型是int**
printf("%p\n", *pp);
printf("%p\n", p);//三个结果相同,说明*pp==p==&a
printf("%p\n", &a);
}
//二级指针访问元素
#include <stdio.h>
int main() {
int arr[4] = { 1,2,3,4 };
int* p = arr;
int** pp = &p;
printf("%d", pp[0][1]);//pp[0]==*(pp+0)==p,p[1]==*(p+1)==arr[1]==2
}
六、指针数组
存放指针的数组。
#include <stdio.h>
//指针数组
int main() {
int a = 2, b = 3, c = 4;
int* p[3] = {&a,&b,&c};
int i = 0;
for (i = 0; i < 3; i++) {
printf("%d ", *p[i]);
}
}
七、指针数组模拟二维数组
用指针数组存放一维数组的首地址,用二维数组访问的方式(数组名[行][列])去访问。
int main() {
int arr1[3] = { 1,2,3 };
int arr2[3] = { 4,5,6 };
int arr3[3] = { 7,8,9 };
int* p[3] = { arr1, arr2, arr3 };
int i = 0;
for (i = 0; i < 3; i++) {
int j = 0;
for (j = 0; j < 3; j++) {
printf("%d ", p[i][j]);//p[i]访问的是一维数组的首地址,p[i]][j]访问该数组里的元素
}
printf("\n");
}
}
八、字符指针变量
存放字符地址的指针变量。通常存放字符数组/字符串常量的首地址。
//字符指针变量
#include <stdio.h>
int main() {
char arr[5] = "abcd";//字符数组
char* a = "abcdef"; //常量字符串,不可修改
char* p = arr;
//printf("%s", p);//%c打印的是单个字符的具体值,%s打印的是到\0之前的所有元素,且需要的是地址
p[0] = 'h';
printf("%s\n", p);
printf("%s",a);
}
注:①%c打印的是单个字符的具体值。
②%s打印的是到\0之前的所有元素,且需要的是地址
九、数组指针变量
存放整个数组地址的指针变量。
//数组指针
#include <stdio.h>
int main() {
int arr[5] = {1,2,3,4,5};
int(*p)[5]= & arr;
int i = 0;
for (i = 0; i < 5; i++) {
printf("%d ", *p[i]);//p==&arr;*p=arr
}
}
十、二维数组传参的本质
第一个一维数组的地址(把二维数组的每一行可以看作是一个一维数组),也是首元素的地址。
#include <stdio.h>
void Print(int(*p)[4], int row, int col) {//4表示一个一维数组有4个元素
int i = 0;
for (i = 0; i < row;i++) {
int j = 0;
for (j = 0; j < col; j++) {
printf("%d", p[i][j]);
}printf("\n");
}
}
int main() {
int arr[3][4] = { {1,1,1,1},{2,2,2,2},{3,3,3,3} };//第一个一维数组的地址
Print(arr, 3, 4);
}
十一、函数指针
存放函数地址的指针。(函数名与&函数名是等价的)
使用语法:
返回类型(*函数指针变量名)(参数类型)
//函数指针
#include <stdio.h>
int Add(int a, int b) {
return a + b;
}
int main() {
//Add(3, 4);
int(*p)(int, int) = Add;//&Add == add;
printf("%d", p(6,7));//利用函数指针使用函数
}
十二、tpyedef(类型重定义)关键字
关键字之一,用来为已有数据类型创建别名。别名的位置放在原来类型变量名的位置。
//typedef关键字
#include <stdio.h>
int Add(int a, int b) {
return a + b;
}
int main() {
typedef int(*Add_t)(int, int);
Add_t p = Add;
printf("%d", p(2, 4));
}
十三、函数指针数组
存放函数指针的数组,它的语法就是在函数指针的基础上加上一个[ ]。
//函数指针数组(利用函数指针数组算3和3的加减乘除运算)
#include <stdio.h>
int Add(int x, int y) {
return x + y;
}
int Sub(int x, int y) {
return x - y;
}
int Mul(int x, int y) {
return x * y;
}
int Div(int x, int y) {
return x / y;
}
int main() {
int (*arr[4])(int, int) = {Add,Sub,Mul,Div};//函数指针数组就是在函数指针的基础上加上[]
int i = 0;
for (i = 0; i < 4; i++) {
int c = arr[i](3, 3);
printf("%d\n", c);
}
}

被折叠的 条评论
为什么被折叠?



