快捷搜索: 王者荣耀 脱发

C语言 指针 类型的用法大汇总(指针/引用/取值) *与&

今天刚好看汇编需要,就学了学。

对星号 * 的总结

1.表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。 2.表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。 3.表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。 4.取指针指向的数据。例如: printf(" 内存地址 %p ", *(p));,printf("当前地址指向的值 %d ", *(*(p)));

关于 * 和 & 的谜题

假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a和&*pa分别是什么意思呢?

&a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 pa),绕来绕去,又回到了原点,&a仍然等价于 a。

&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。

多级指针 ***p3等价于*(*(*p3))

如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。

int a =100;
int *p1 = &a;
int **p2 = &p1;
#include <stdio.h>
int main(){
    int a =100;
    int *p1 = &a;
    int **p2 = &p1;
    int ***p3 = &p2;
    printf("%d, %d, %d, %d
", a, *p1, **p2, ***p3);
    printf("&p2 = %#X, p3 = %#X
", &p2, p3);
    printf("&p1 = %#X, p2 = %#X, *p3 = %#X
", &p1, p2, *p3);
    printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X
", &a, p1, *p2, **p3);
    return 0;
}
int (*p)[4] = a;

括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。

二维数组的例子:用来学习 *(p+1)和 *(p)+1 的区别

#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include <stdio.h>
#include "WinDef.h"

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

	printf(" 取二维数组的第一行的内存地址   %p
", *(p));

    printf(" 取二维数组的第一行的第一个元素   %d
", *(*(p)+0));
	printf("取二维数组的第一行的第二个元素    %d
", *(*(p)+1));

	printf(" 取二维数组的第二行的内存地址   %p
", *(p+1));

	printf(" 取二维数组的第二行的第一个元素   %d
", *(*(p+1)+0));
	printf("取二维数组的第二行的第二个元素    %d
", *(*(p+1)+1));

    return 0;
}

*(p+1)+1表示第 1 行第 1 个元素的地址。如何理解呢?

*(p+1)单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。

*(*(p+1)+1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

根据上面的结论,可以很容易推出以下的等价关系: a+i == p+i a[i] == p[i] == *(a+i) == *(p+i) a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)

结构体待议

#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include <stdio.h>
#include "WinDef.h"

int main(){
    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1;
    //给结构体成员赋值
    stu1.name = "Tom";
    stu1.num = 12;
    stu1.age = 18;
    stu1.group = A;
    stu1.score = 136.5;
    //读取结构体成员的值
    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!
", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
    return 0;
经验分享 程序员 微信小程序 职场和发展