代码改变世界

关于c语言指针的一些理解

2016-06-01 13:56  小竹心语  阅读(224)  评论(0编辑  收藏  举报

1 指针就是地址,地址就是指针
   地址就是内存单元的编号
  指针变量是存放地址的变量
指针和指针变量是两个不同的概念
但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样

 

2 关于形参传递,例如下面这两个函数

void test(int *arr)

void test(int arr[])

作为形参时,传递的无论是数组还是指针,其本质传递的都是一个指针,所以说上面两个函数是一样的。

 

void main()
{
    int i=10;
int *p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址 *p=i;//错误
   p=&i; //正确 }

  上述中*p=i;和p=&i;对于编程的人来说都是想把i的地址给p,但第一句是错的

因为你只是把i的值给*p,但是关于他的地址p是多少还是不确定的,这句话只是在未知的一个地址上写了一个值,这个值是10,当然编译器会给出警告,运行时会导致程序奔溃。

而p=&i,则是把i的地址给了p,p指向了i,当然,此时*p就等于i,等于10.

1 void test(char *arr)
2 {
3     char *p=arr;
4 }

同理,对上面这个函数的理解,传进来一个指针参数,把他赋值给p,即 p=arr,因为数据类型是char *

而不是*p=arr。

 

 

5 对于互换两个数的理解

 

 1 int main(void)
 2 {
 3     int a = 3;
 4     int b = 5;
 5 
 6     huhuan_3(&a, &b); //huhuan_2(*p, *q); 是错误的, 
 7     printf("a = %d, b = %d\n", a, b);
 8 
 9     return 0;
10 }
11 
12 void huhuan_3(int * p, int * q)
13 {
14     int t; 
15 
16     t = *p;  //p是int *,  *p是int
17     *p = *q;
18     *q = t;
19 }    

对于互换函数的理解,

   1 t=*p,即t=a=3.

  2 *p=*q, 表示在地址为p的地方写入1个数,这个数是*q,即b,而p就是a的地址,所以a=5

(上面的说法严格上说是不准确的,因为

 P不是地址,P是一个变量,里面存放的是地址,正确的理解是

 表示指针变量P里面存放地址所对应的内存单元 写入 1   ,但通俗的按上面理解就可以了。

  3 *q=t, 表示在地址为q的地方写入1个数,这个数为t,即3,而q就是b的地址,所以b=3

 经过上面几步,把a,b对应的地址上的数改变掉了,所以a和b发生了改变