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)指针和二维数组

浙公网安备 33010602011771号