11-C语言指针
目录:
一、指针
1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址。
2 保存指针的变量,就叫指针变量,(保存地址)
3 声明一个指针变量
int i = 0;
int* p;//声明一个指针变量 int*指针类型
int * p; int* p; int *p;//这几种写法都行
4 每个指针变量能指向一种特定类型的对象。
5 指针是引用数据类型,因为本身没有保存最终数据,只是保存了数据的地址,间接的找到内存中的数据。
6 指针的用法
指针可用于参数,传递变量的地址,相当于多个函数共享内存地址(内存空间)。
7 值传递:相当于不同变量,指向不同区域
地址传递:相当于同一变量,指向同一区域
p:指针的值 &i:取i的地址
*p:指针指向的值 i:变量名
练习:
1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。
2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。
指针也可以做为返回值,但不要返回自动变量。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。
3)指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。
#include <stdio.h> //指针的基本使用 void test(){ int i = 10; //声明指针 int* p; //int * p2; //int *p3; //赋值 p = &i; //取值 printf("i val: %d\n",i); printf("i address: %p\n",&i); printf("p val: %d\n",*p);//*p指针指向的值 printf("p address: %p\n",p);//p是指针的值 } //指针可用于参数,传递变量的地址; void test2(int* p){ printf("p->val:%d\n",*p); *p = 20; printf("p->val:%d\n",*p); } //练习:1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。 void test3(int* p1,int* p2){ printf("p1->%d,p2->%d\n",*p1,*p2); int temp = 0; temp = *p1; *p1 = *p2; *p2 = temp; printf("p1->%d,p2->%d\n",*p1,*p2); } //2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。 void test4(int size,int array[],int* maxp,int* minp){ for (int i = 0; i < size; i++) { if (array[i] > *maxp) { *maxp = array[i]; } if (array[i] < *minp) { *minp = array[i]; } } } //指针也可以做为返回值,但不要返回自动变量(局部变量)。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。解决方案,增长生命周期。 int* test5(){ static int i = 10; int* p = &i; return p; } //指针支持加整数、减整数 void test6(){ int array[5] = {9,2,3,4,5}; printf("array address:%p\n",array); int* p = array; printf("p address:%p\n",p); printf("p->val:%d\n\n",*p); //指针+1 地址+4 printf("p+1 address:%p\n",p+1); printf("p+1->val:%d\n",*(p+1)); // printf("\n*(p+1)->val:%d\n",*(p+1)); printf("(*p)+1->val:%d\n\n",(*p)+1); //遍历数组 for (int i = 0; i < 5; i++) { printf("p+%d->val:%d\n",i,*(p+i)); printf("array[%d]:%d\n",i,array[i]); printf("array+%d:%d\n\n",i,*(array+i)); } //存储空间 printf("array size:%ld\n",sizeof(array)); printf("p size:%ld\n",sizeof(p)); //赋值 int array2[6] = {0}; int* p2 = array2; printf("\np address:%p\n",p); p = p2; printf("p address:%p\n",p); } int main(int argc, const char * argv[]) { test6(); // int* p = test5(); // printf("p:%p\n",p); // printf("p->val:%d\n",*p); // test(); // int i = 10; // int* p = &i; // printf("i val:%d\n",i); // test2(p); // printf("i val:%d\n",i); // int i = 2; // int j = 3; // int* p1 = &i; // int* p2 = &j; // printf("i:%d,j:%d\n",i,j); // test3(p1,p2); // printf("i:%d,j:%d\n",i,j); // int num[5] = {0}; // int max = 0,min = 100; // for (int i = 0; i < 5; i++) { // printf("输入第%d个数:\n",i); // scanf("%d",&num[i]); // } // test4(5,num,&max,&min); // printf("max:%d\n",max); // printf("min:%d\n",min); return 0; }
二、指针与数组
1 占用空间
数组占用空间 = 数组元素占用空间*长度
指针占用空间 = 在64位系统下,固定8个字节,与指针类型无关。
2 赋值
数组是不可以修改其值,指针可以多次赋值。
作业:
1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。
2)使用函数交换两个值,在main函数中输出结果。
3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。
4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。
1 #include <stdio.h> 2 /* 3 1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。 4 */ 5 void test1(int length,int num[],int* sum,int* cha,int* ji,int* shang){ 6 for (int i = 0; i < length; i++) { 7 *sum += num[i]; 8 *cha -= num[i]; 9 *ji *= num[i]; 10 *shang /= num[i]; 11 } 12 } 13 /* 14 2)使用函数交换两个值,在main函数中输出结果。 15 */ 16 void test2(int* p1,int* p2){ 17 int temp = 0; 18 temp = *p1; 19 *p1 = *p2; 20 *p2 = temp; 21 } 22 /* 23 3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。 24 */ 25 void test3(int miaoshu,int* h,int* minute,int* miao){ 26 *h = miaoshu / 3600; 27 *minute = miaoshu % 3600 / 60; 28 *miao = miaoshu % 60; 29 } 30 /* 31 4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。 32 */ 33 int* test4(int length,int num[]){ 34 static int max = 0; 35 int* p = &max; 36 for (int i = 0; i < length; i++) { 37 if (num[i] > max) { 38 *p = num[i]; 39 } 40 } 41 return p; 42 } 43 int main(int argc, const char * argv[]) 44 { 45 int num[5]; 46 for (int i =0; i < 5; i++) { 47 printf("输入第%d个数:",i+1); 48 scanf("%d",&num[i]); 49 } 50 int* p1 = test4(5,num); 51 printf("最大值:%d\n",*p1); 52 53 // int miaoshu,hour,minute,miao; 54 // printf("输入秒数:"); 55 // scanf("%d",&miaoshu); 56 // test3(miaoshu,&hour,&minute,&miao); 57 // printf("%d时%d分%d秒\n",hour,minute,miao); 58 59 // int i = 2; 60 // int j = 3; 61 // test2(&i,&j); 62 // printf("i:%d,j:%d\n",i,j); 63 64 // int num[5]; 65 // int sum = 0,cha = 0,ji = 1,shang = 1; 66 // int length = 5; 67 // for (int i =0; i < 5; i++) { 68 // printf("输入第%d个数:",i+1); 69 // scanf("%d",&num[i]); 70 // } 71 // test1(length,num,&sum,&cha,&ji,&shang); 72 // printf("和:%d\n",sum); 73 // printf("差:%d\n",cha); 74 // printf("积:%d\n",ji); 75 // printf("商:%d\n",shang); 76 return 0; 77 }