·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 【学习笔记】【C语言】指针

【学习笔记】【C语言】指针

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

一、指针变量的定义

1. 格式:变量类型 *指针变量名;
2. 举例:int *p;   char *p2;
3. 注意:定义变量时的*仅仅是指针变量的象征

二、利用指针变量简单修改其他变量的值

1.指向某个变量
int a;

int *p;
p = &a;
或者
int *p = &a;

2.修改所指向变量的值
*p = 10;

3.在函数内部修改外面变量的值
int a = 10;
change(&a);

void change(int *n)
{
    *n = 20;
}

三、指针与数组

1.将数组当做函数参数传入时,会自动转为指针

四、指针与字符串

1.定义字符串的2种方式
1> 利用数组
char name[] = "ios";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改

2> 利用指针
char *name = "ios";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

2.定义字符串数组
1> 利用二维字符数组
char names[2][10] = {"jack", "rose"};

2> 利用指针数组
char *names[2] = {"jack", "rose"};

五、代码

1.定义

 1 #include <stdio.h>
 2 
 3 void change(int);
 4 
 5 int main()
 6 {
 7     /*
 8     int a = 90;
 9     
10     change(&a);
11     
12     PRintf("a=%d\n", a);
13     */
14     
15     // 变量类型  变量名;
16     // 格式:变量类型 *变量名;
17     // 定义了一个指针变量p
18     // 指针变量只能存储地址
19     // 指针就一个作用:能够根据一个地址值,访问对应的存储空间
20     // 指针变量p前面的int:指针变量p只能指向int类型的数据
21     int *p;
22     
23     int a = 90;
24     
25     // 指针变量p指向了变量a
26     p = &a;
27     
28     *p = 10;
29 
30     a = 20;
31     
32     printf("%d\n", *p);
33     
34     //printf("%d\n", a);
35     
36     return 0;
37 }
38 
39 void change(int n)
40 {
41     n = 10;
42 }

2.使用注意

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     /* 不建议的写法, int *p只能指向int类型的数据
 6     int *p;
 7     double d = 10.0;
 8     p = &d;*/
 9     
10     /* 指针变量只能存储地址
11     int *p;
12     p = 200;
13     */
14     
15     /* 指针变量未经过初始化,不要拿来间接访问其他存储空间
16     int *p;
17     printf("%d\n", *p);
18     */
19     
20     int a = 10;
21     /*
22     int a;
23     a = 10;
24     */
25     
26     /*
27     int *p;
28     p = &a;
29     */
30     // 定义变量时的*仅仅是一个象征,没有其他特殊含义
31     int *p = &a;
32     
33     // 不正确的写法
34     // *p = &a;
35     p = &a;
36     
37     // 这个时候的*的作用:访问指向变量p指向的存储空间
38     *p = 20;
39     
40     
41     char c = 'A';
42     
43     char *cp = &c;
44     
45     *cp = 'D';
46     
47     printf("%c\n", c);
48     
49     return 0;
50 }

3.指向指针的指针

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a = 10;
 5     
 6     int *p = &a;
 7     
 8     int **pp = &p;
 9     
10     // a = 20;
11     
12     // *p = 20;
13     
14     /*
15     (*pp) == p
16     
17     *(*pp) == *p = a
18     
19     **pp == *p = a
20     */
21     **pp = 20;
22     
23     printf("%d\n", a);
24     
25     //int ***ppp = &pp;
26     
27     /*
28     char a2 = 'A';
29     char *p2 = &a2;
30     */
31     
32     return 0;
33 }

4.练习

 1 #include <stdio.h>
 2 void swap(int *v1, int *v2);
 3 
 4 int main()
 5 {
 6     /*
 7     int a = 10;
 8     int b = 11;
 9     
10     swap(&a, &b);
11     */
12     
13     
14     int a2 = 90;
15     int b2 = 89;
16     
17     swap(&a2, &b2);
18     
19     printf("a2=%d, b2=%d\n", a2, b2);
20     return 0;
21 }
22 
23 /* 不能交换外面实参的值,仅仅是交换了内部指针的指向
24 void swap(int *v1, int *v2)
25 {
26     int *temp;
27     temp = v1;
28     v1 = v2;
29     v2 = temp;
30 }*/
31 
32 // 完成两个整型变量值的互换
33 void swap(int *v1, int *v2)
34 {
35     int temp = *v1;
36     *v1 = *v2;
37     *v2 = temp;
38 }
39 
40 /* 交换的只是内部v1、v2的值
41 void swap(int v1, int v2)
42 {
43     int temp = v1;
44     v1 = v2;
45     v2 = temp;
46 }*/
 1 #include <stdio.h>
 2 int sumAndMinus(int n1, int n2, int *n3);
 3 
 4 int main()
 5 {
 6     int a = 10;
 7     int b = 7;
 8     
 9     // 存储和
10     int he;
11     // 存储差
12     int cha;
13     c
14     he = sumAndMinus(a, b, &cha);
15     
16     printf("和是%d, 差是%d\n", he, cha);
17     
18     return 0;
19 }
20 
21 // 返回值是
22 int sumAndMinus(int n1, int n2, int *n3)
23 {
24     *n3 = n1 - n2;
25     
26     return n1 + n2;
27 }

5.指针和数组

 1 #include <stdio.h>
 2 
 3 /*
 4  1.数组元素的访问方式
 5  int ages[5];
 6  int *p;
 7  p = ages;
 8  1> 数组名[下标]  ages[i]
 9  2> 指针变量名[下标] p[i]
10  3> *(p + i)
11  
12  2.指针变量+1,地址值究竟加多少,取决于指针的类型
13   int *   4
14   char *  1
15   double * 8
16  */
17 void change(int array[]);
18 
19 int main()
20 {
21     // 20个字节
22     int ages[5] = {10, 11, 19, 78, 67};
23     
24     change(ages);
25     
26     return 0;
27 }
28 
29 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
30 void change(int *array)
31 {
32     printf("%d\n", array[2]);
33     //printf("%d\n", *(array+2));
34 }
35 
36 /*
37 void change(int array[])
38 {
39     int s = sizeof(array);
40     
41     printf("%d\n", s);
42 }*/
43 
44 void test()
45 {
46     double d = 10.8;
47     double *dp;
48     dp = &d;
49     
50     printf("dp = %p\n", dp);
51     printf("dp + 1 = %p\n", dp + 1);
52     
53     int ages[5] = {10, 9, 8, 67, 56};
54     
55     int *p;
56     // 指针变量p指向了数组的首元素
57     p = &ages[0];
58     // 数组名就是数组的地址,也是数组首元素的地址
59     //p = ages;
60     
61     /*
62      p ---> &ages[0]
63      p + 1 ---> &ages[1]
64      p + 2 ---> &ages[2]
65      p + i ---> &ages[i]
66      */
67     
68     //printf("%d\n",  *(p+2));
69     
70     printf("%d\n",  p[2]);
71     
72     /*
73      for (int i = 0; i<5; i++) {
74      printf("ages[%d] = %d\n", i, *(p+i));
75      }*/
76     
77     
78     //    printf("%p\n", p);
79     //    printf("%p\n", p + 1);
80     //    printf("%p\n", p + 2);
81 }

6.指针和字符串

 1 #include <stdio.h>
 2 
 3 /*
 4  1.常量区
 5  存放一些常量字符串
 6  
 7  2.堆
 8  对象
 9  
10  3.栈
11  存放局部变量
12  
13  掌握:
14  定义字符串的2种方式
15  1> 利用数组
16  char name[] = "itcast";
17   * 特点:字符串里面的字符是可以修改的
18   * 使用场合:字符串的内容需要经常修改
19  
20  2> 利用指针
21   char *name = "itcast";
22   * 特点:字符串其实是一个常量字符串,里面的字符是不能修改
23   * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
24  */
25 
26 int main()
27 {
28     char name[20];
29     
30     printf("请输入姓名:\n");
31     
32     scanf("%s", name);
33     
34     // 'j' 'a' 'c' 'k' '\0'
35     
36     //printf("%c\n", name[3]);
37     
38     //printf("刚才输入的字符串是:%s\n", name);
39     
40     return 0;
41 }
42 
43 // 定义字符串数组
44 void test2()
45 {
46     char *name = "jack";
47     
48     //int ages[5];
49     
50     // 指针数组(字符串数组)
51     char *names[5] = {"jack", "rose", "jake"};
52     
53     // 二维字符数组(字符串数组)
54     char names2[2][10] = {"jack", "rose"};
55 }
56 
57 // 定义字符串
58 void test()
59 {
60     // 字符串变量
61     char name[] = "it";
62     name[0] = 'T';
63     
64     //printf("%s\n", name);
65     
66     
67     // "it" == 'i' + 't' + '\0'
68     // 指针变量name2指向了字符串的首字符
69     
70     // 字符串常量
71     char *name2 = "it";
72     
73     char *name3 = "it";
74     
75     //*name2 = 'T';
76     
77     //printf("%c\n", *name2);
78     
79     printf("%p\n%p\n", name2, name3);
80     
81     //printf("%s\n", name2);
82 }
 1 #include <stdio.h>
 2 /*
 3  (不包括\0)
 4  编写一个int string_len(char *s),返回字符串s的字符长度
 5  
 6  */
 7 int string_len(char *s);
 8 
 9 int main()
10 {
11     //char *name = "itcast";
12     
13    // 男 \u434\u4343\u434
14     
15     int size = string_len("tre777");
16     
17     printf("%d\n", size);
18     return 0;
19 }
20 
21 int string_len(char *s)
22 {
23     // 1.定义一个新的指针变量指向首字符
24     char *p = s;
25     
26     /*
27     while ( *s != '\0' )
28     {
29         s++;
30     }*/
31     
32     while ( *s++ ) ; 
33     
34     return s - p - 1;
35 }
36 
37 /*
38 int string_len(char *s)
39 {
40     // 记录字符的个数
41     int count = 0;
42     
43     // 如果指针当前指向的字符不是'\0'
44     // 首先*s取出指向的字符
45     // 然后s++
46     while ( *s++ )
47     {
48         // 个数+1
49         count++;
50         
51         // 让指针指向下一个字符
52         //s = s + 1;
53         //s++;
54     }
55     
56     return count;
57 }
58 */
59 
60 /*
61 int string_len(char *s)
62 {
63     // 记录字符的个数
64     int count = 0;
65     
66     // 如果指针当前指向的字符不是'\0'
67     while ( *s != '\0')
68     {
69         // 个数+1
70         count++;
71         
72         // 让指针指向下一个字符
73         //s = s + 1;
74         s++;
75     }
76     
77     return count;
78 }*/