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


    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
    ", 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发生了改变

  • 相关阅读:
    [LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点
    [LeetCode]77. Reverse Linked List反转链表
    [LeetCode]76. Permutation Sequence全排列序列
    [LeetCode]75. Pow(x,n)幂运算
    粘连字符分割初探~~
    验证码识别学习~~
    用VS2010编C#程序扫盲 2
    用VS2010编C#程序扫盲
    验证码降噪方法汇总~~~~~
    新生活......
  • 原文地址:https://www.cnblogs.com/tiantiantian-dianzi/p/5549385.html
Copyright © 2020-2023  润新知