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 }
posted @ 2013-12-14 12:38  回读(IOS)  阅读(424)  评论(2编辑  收藏  举报