zoukankan      html  css  js  c++  java
  • 指针初学

    指针

    1、指针变量与普通变量

    我的理解就是,普通变量的值,只是供程序员和程序所使用的值,而指针变量的值则不同,它的值存放的是其他变量的地址。

    定义指针变量与定义普通变量及其相识,只需在变量名前面加星号(*),指针 = *变量。即:

    int *p;

    或者:

    int a[10];
    int *p = &a;

    其中星号(*)是一个特殊符号,表明一个变量是指数变量,定义时必须带有星号(*),而赋值时不能带有星号。

    指针也可以连续定义,连续定义时必须每个都带星号(*),如:

    int *a, *b, *c;

    而不能:

    int *a, b, c;

    这样定义表示定义了一个指针变量a和两个普通变量b和c。

    获取指针变量指向的值

    指针变量存储了数据的地址,通过指针变量能够获得该地址上的数据,格式为:

    *q

    他的意义为:*指针 = 指针指定变量的值。

    下面举个例子:

    #include<stdio.h> 
    
    int main()
    {    
        int a = 100;
        int *q = &a;
        printf("%d,%d",a,*q);
        return 0;
    } 

    运行结果:

    100,100

    指针除了可以获取内存上的数据,也可以修改内存上的数据,例如:

    #include <stdio.h>
    int main() { int a = 10, b = 55, c = 111; int *p = &a; *p = b; c = *p; printf("%d, %d, %d, %d ", a, b, c, *p); return 0; }

    运行结果:

    55, 55, 55, 55

    要注意的是,定义指针变量时,用星号(*)来表明这是个指针变量,使用指针变量时星号(*)表明指针指向的值。

    2、指针变量与一维数组

    主要内容为:指针 = &数组名[某数]         *指针 = 指针指向变量的值       指针+i = &数组名[某数 + i]

    下面举个例子:

    #include <stdio.h>

    int main()
    {
        int *p, *q, a[3] = {5,10,15};
        p = &a[0];
        q = &a[1];
        printf("开始时a[0]=%d,a[1]=%d,a[2]=%d ",a[0],a[1],a[2]);
        *p = *p*2;
        *(q + 1) = *p*2;
        printf("运算后a[0]=%d,a[1]=%d,a[2]=%d ",a[0],a[1],a[2]);
        return 0;
    }

    运行结果:

    开始时a[0]=5,a[1]=10,a[2]=15
    运算后a[0]=10,a[1]=10,a[2]=20

    解释:开始我们定义了一个一维数组a,和两个指针变量p,q。我们使p指向a[0],q指向a[1]。开始时a[0]=5。然后进行运算 *p = *p*2是让指针p指向的值(即a[0]的值5)进行乘2运算,所以最后a[0]=5*2=10。

    同理开始时a[0]=10(因为上一步进行了运算),q指向a[1],然后进行运算 *(q + 1) = *p*2是让指针(q + 1)即指向a[1  + 1]=a[2]的值为*p*2= 10*2=20。

    3、指针变量与二维数组

    主要内容为:指针 = &数组名[数a][数b]         *指针 = 指针指向变量的值       指针+i = &(数组名[数a][数b]后的第i个元素) 即关联数组后的第i个元素

    下面举个例子:

    #include <stdio.h>
    
    int main()
    {
        int *p, *q, a[2][3] = {{1,2,3},{4,5,6}};
        p = &a[0][0];
        q = &a[1][1];
        printf("开始时a[0][0]=%d,a[1][2]=%d
    ",a[0][0],a[1][2]);
        *p = *p*2;
        *(q + 1) = *p*2;
        printf("运算后a[0][0]=%d,a[1][2]=%d
    ",a[0][0],a[1][2]);
        return 0;
    }

    运行结果:

    开始时a[0][0]=1,a[1][2]=6
    运算后a[0][0]=2,a[1][2]=4

    解释:开始我们定义了一个二维数组a,和两个指针变量p,q。我们使p指向a[0][0],q指向a[1][1]。开始时a[0][0]=1。然后进行运算 *p = *p*2是让指针p指向的值(即a[0][0]的值1)进行乘2运算,所以最后a[0]=1*2=2。

    同理开始时a[1][1]=5,q指向a[1],然后进行运算 *(q + 1) = *p*2是让指针(q + 1)即指向a[1][1]后的第一个数,即a[1][2]的值为*p*2= 2*2=4。

    4、指针变量指向二维数组的行变量

    定义: *(p)[列数]

    关联: p= 二维数组名+某数n

    等同于  *(*(p + i) + j) = 二维数组名[p + i][j]

    举个例子:

    int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    int (*p)[4];
    p = a + 1; a[
    1][2] = *(*p + 2); a[2][2] = *(*(p + 1) + 2);

    上例创建了一个三行两列的二维数组,我们定义了一个指针p指向二维数组的行变量。开始让他等于a+1的意义就是让他指向第二行,这时*p = 1。

    所以我们能得到下面的两组等式a[1][2] = *(*p + 2)与a[2[2] = *(*(p + 1) + 2)。

  • 相关阅读:
    LeetCode15 3Sum
    LeetCode10 Regular Expression Matching
    LeetCode20 Valid Parentheses
    LeetCode21 Merge Two Sorted Lists
    LeetCode13 Roman to Integer
    LeetCode12 Integer to Roman
    LeetCode11 Container With Most Water
    LeetCode19 Remove Nth Node From End of List
    LeetCode14 Longest Common Prefix
    LeetCode9 Palindrome Number
  • 原文地址:https://www.cnblogs.com/zj666666/p/12326914.html
Copyright © 2011-2022 走看看