C语言第7课 指针

来源:互联网 发布:如何进行会员数据分析 编辑:程序博客网 时间:2024/06/06 01:51

每一个内存由8位二进制位,也就是一个字节。每一个存储单元都有唯一的编号,这个编号就称为内存单元的地址。

当一个数据占用了多个地址的时候,选用第一个地址作为它的地址。

指针变量也有地址,指针变量的值是另一个变量的地址。我们只关心指针变量究竟指向了哪一个地址,而不关心指针变量的地址。





变量p是指针,指针存放的是变量i的地址,变量i存放的是i的一个值。



指针就是地址,而变量的指针就是变量的地址

指针变量的定义: 类型标识符 * 指针变量名  

例如 :  int * a ;  // 定义了一种类型的指针就只能指向这一种类型,不能指向其他的类型了。



取地址运算符(&)


C语言中提供了取地址运算符& ,它可以取得变量的存储地址,是一个一元运算符。假设有变量 x , 那么 &x 就是变量x的地址

int x = 5, *p ; 
p = &x ;






取值运算符(*)


如果指针变量指向了某个变量,那么就可以使用取值运算符 * 来访问变量中的内容
int  x = 5;
int  *p ;
p = &x;
printf( "%d\n" , *p);   // 打印的值为 5


如果指针变量p 指向了 x ,那么 *p就代指的是变量  i。因此, *p的值就是变量 x 的值,改变 *p 的值 实际上就是改变 变量 x 的值。




初始的 i的值是5 把变量 i 的地址赋给 p ,p指向的i的地址



改变i的值, printf( "%d\n" , i);   // 打印的值为10 ,因为 i的值被改变了
      printf("%d\n"  ,*p); // 打印的值为10 , 因为 i的值改变了,p的值没有改变,依旧指向的是 i的地址, 而 *p是取 指向的 i的值,所以 *p被改变了 为10




改变*p的值, printf( "%d\n" , i);   // 打印的值为20 ,因为 *p的值被改变了, *p的值 就是 p所对应的地址 i 的值,所以 *p被改变实际上就是 i呗改变了。
      printf("%d\n"  ,*p); // 打印的值为20 , 因为 i的值改变了,而至始至终 p一直没有被改变,都是对应的 i的地址,所以 *p 为20。





改变i的值, printf( "%d\n" , i);   // 打印的值为10 ,因为 i的值被改变了
      printf("%d\n"  ,*p); // 打印的值为10 , 因为 i的值改变了,p的值没有改变,依旧指向的是 i的地址, 而 *p是取 指向的 i的值,所以 *p被改变了 为10


指针变量的赋值

int i , j , *p , *q ;
p =  &i;
q = &j;
p = q;

这样下来, p q 都同时指向了 j , 因为 p = q 相当于是把 q所指的地址 j 赋给了 p, 所以 p q 现在同时指向 j ,










由此可以看出,*p = *q 是把 j的值给i ,但是 p依旧是指向i, q依旧是指向j



改变i的值, printf( "%d\n" , i);   // 打印的值为10 ,因为 i的值被改变了
      printf("%d\n"  ,*p); // 打印的值为10 , 因为 i的值改变了,p的值没有改变,依旧指向的是 i的地址, 而 *p是取 指向的 i的值,所以 *p被改变了 为10



指针作为函数参数








当调用 change函数的时候,传递给函数的变量是 i 和 j 的地址而不是值。在函数change的内部,变量 p 和 q 声明为指针,因此p,q 对应的是 i 和 j 的地址。
函数change中, 意思是: 把地址 p 中的值赋给了 temp , 把地址q 中的值赋给了 p的值, 把 temp的值赋给了 q的值, 又因为 p表示的是 i 的地址, q表示的是 j 的地址,因此 i 的值被改变成了 4 , j 的值被改变成了3。

指针作为返回值:







 传入的是 i ,j 的地址,其中 getMax 函数接收的是 p ,q 两个指针变量, p 对应的是 i 的地址, q对应的是 j 的地址 , *p 就是 i 的值 ,*q 就是 j 的值, 因为 j 的值大于 i 的值,所以返回了 q 这个指针, q这个指针指向的地址是 j 的地址 ,对应的 *q 的值就是 j的值。


指向函数的指针:


定义的格式为 :  返回值类型 ( * 指针变量名) (  与指向的函数相同的参数个数 ) ;






指向函数的指针必须与函数返回同一种类型的值,而且参数要一样,否则会报错!使用就和直接调用函数是一样的。



指针指向的函数可以指向多个函数,体现了结构化的思想。

指针与数组:








如图所示, 都在图上.....   特别说明一点 ,当 p2 - p1 的时候 因为两个之间差了1个内存空间,所以差为2,相当于是 p2的内存地址为99,它由4个内存字节组成, p1内存地址是97,他也由4个字节组成,所以他俩相差了2。


改变i的值, printf( "%d\n" , i);   // 打印的值为10 ,因为 i的值被改变了
      printf("%d\n"  ,*p); // 打印的值为10 , 因为 i的值改变了,p的值没有改变,依旧指向的是 i的地址, 而 *p是取 指向的 i的值,所以 *p被改变了 为10
0 0
原创粉丝点击