14.指针深入学习_B【郝斌C语言入门学习】

1.基本类型的指针

形参和实参不是同一个变量

 1 # include <stdio.h>
 2 void f(int i)//i是函数f() 的局部变量
 3 {
 4     i = 99;
 5 }
 6 int main(void)
 7 {
 8     int i = 6; //i是函数main()的局部变量
 9     printf("i = %d\n", i);
10     f(i);
11     printf("i = %d\n", i);
12     return 0;
13 }
14 /*
15     在vc++6.0中的输出结果:i = 6
16                          i = 6
17 */

如何通过被调函数修改主调函数普通变量的值

  1)实参必须为普通变量的地址

  2)形参必须为指针变量

  3)在被调函数中,通过*形参名的参数就可以修改主调函数的相关变量

例题:指针变量可以使被调函数返回一个以上的值。

 

 1  1 # include <stdio.h>
 2  2 void g(int * p, int * q)
 3  3 {
 4  4     *p = 1;
 5  5     *q = 2;
 6  6 }
 7  7 int main(void)
 8  8 {
 9  9     int a = 3;
10 10     int b = 5;
11 11     g(&a, &b);    
12 12     printf("a = %d, b = %d\n", a, b);
13 13     return 0;
14 14 }

 

2.指针和数组

复习数组:

 

(1)指针和一维数组

  1)数组名:一维数组名是个指针常量(值不能改变),它存放的是第一个元素的地址。

 

 1 # include <stdio.h>
 2 int main(void)
 3 {
 4     int a[5];//a是数组名,5是数组元素的个数,元素就是变量 a[0]--a[4]
 5 //    int a[3][4];//3行4列,a[0][0]是第一个元素,a[i][j]是第i+1行j+1列
 6     int b[5];
 7 //    a = b;//错误,a是指针常量
 8     printf("%#X\n", &a[0]);
 9     printf("%#X\n", a);
10     return 0;    
11 }
12 /*
13     在vc++6.0中的输出结果:
14     ——————————————
15     0X61FF1C
16     0X61FF1C    
17     ——————————————
18 */

  2)下标和指针的关系:

  如果p是个指针变量,则 p[i] 永远等价于 *(p+i)

  确定一个一维数组需要几个参数如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息

  需要两个参数:数组第一个元素的地址,数组的长度

例题1:

 

 1 # include <stdio.h>
 2 //f函数可以输出任何一个一维数组的内容
 3 void f(int * pArr, int len)
 4 {    
 5     int i;
 6     for (i=0; i<len; i++)
 7         printf("%d ", *(pArr + i));
 8 }
 9 int main(void)
10 {
11     int a[5] = {1, 2, 3, 4, 5};
12     int b[6] = {-1, -2, -3, -4, -5, -6};
13     f(a, 5);
14     f(b, 6);
15     return 0;    
16 }
17 /*
18     在vc++6.0中的输出结果:
19     ——————————————
20     1 2 3 4 5 -1 -2 -3 -4 -5 -6
21     ——————————————
22 */

 

例题2: 

 

 1 # include <stdio.h>
 2 void f(int * pArr, int len)
 3 {
 4     pArr[3] = 88;//pArr[3] = *(pArr + 3)
 5 }
 6 int main(void)
 7 {
 8     int a[6] = {1, 2, 3, 4, 5, 6};
 9     printf("%d\n", a[3]);//4
10     f(a, 6);
11     printf("%d\n", a[3]);//a[3] = *(a+3))
12     return 0;
13 }

 

例题3

 

 1 # include <stdio.h>
 2 //f函数可以输出任何一个一维数组的内容
 3 void f(int * pArr, int lon)
 4 {    
 5     int i;
 6     for (i=0; i<lon; i++)
 7         printf("%d ", pArr[i]);
 8         //*(pArr + i) 等价于 pArr[i] 也等价于b[i] 也等价于*(b + i)
 9 }
10 int main(void)
11 {
12     int a[5] = {1, 2, 3, 4, 5};
13     int b[6] = {-1, -2, -3, -4, -5, -6};
14     int c[100] = {1, 99, 22, 33};
15     f(b, 6);
16     return 0;    
17 }
18 /*
19     在vc++6.0中的输出结果:
20     ——————————————
21     -1 -2 -3 -4 -5 -6
22     ——————————————
23 */

 

 

 

  3)指针变量的运算

  指针变量不能相加 不能相乘 不能相除

  如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减。

  一个指针变量到底占几个字节:一个指针变量,无论它指向的变量占几个字节,该指针变量本身只占4个字节。

                一个变量的地址使用该变量首字节的地址来表示的。

  预备知识sizeof(数据类型) 返回值就是该数据类型所占的字节数

例题:sizeof(char) = 1  sizeof(int) = 4  sizeof(double) = 8

              假设p指向char类型的变量(1个字节)

              假设p指向int类型的变量(4个字节)

              假设p指向double类型的变量(8个字节)

              p、q、r本身所占的字节是否一样

 

 1 # include <stdio.h>
 2 int main(void)
 3 {
 4     char ch = 'A';
 5     int i = 99;
 6     double x = 66.6;
 7     char * p = &ch;
 8     int * q = &i;
 9     double * r = &x;
10     printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));
11     //一个指针变量,无论它指向的变量占几个字节,该指针变量本身只占4个字节。
12     return 0;
13 }
14 /*
15 --------------------------------------------------------
16     在vc++6.0中的输出结果:4 4 4
17 --------------------------------------------------------
18 */

 

 

(2)指针和二维数组

 

 

posted @ 2024-08-15 15:38  java帝国  阅读(29)  评论(0)    收藏  举报