C语言基础04--指针

Catalogue
  1. 1. C语言基础04–指针
    1. 1.0.1. 指针与变量之间的关系
    2. 1.0.2. 指针与数组
    3. 1.0.3. 指针与函数
      1. 1.0.3.1. 函数指针
      2. 1.0.3.2. 指针函数

C语言基础04–指针

指针与变量之间的关系

*:指针运算符,跟在变量前表示指向地址的值

&:取地址运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main() {
int a = 123;
int * b = &a; //指什么类型的地址,声明什么类型的指针
//这里是把a的地址给b
*b = 666;
//a指的是地址上的值
//b指的是地址
//&a指的是地址
//*b指的是地址上的值
a = 567;
return 0;
}
//在汇编中
//mov dword ptr [a] ,2F6ah
//dword 是数据长度,4字节
//ptr 指针
//a a的地址
//[a] a的值

指针与数组

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main() {
//数组是内存地址中连续的存储空间
//数组的名字指向数组首地址
int n[5] = { 1,2,3,4,5 };
int * a = n; //a就是数组首地址,*a的值为1
int b = *(a + 1);//这里+1指的是+1个int类型的长度
//(a+1)相当于是数组下一位的地址,然后前面跟上*来取地址的值
return 0;
}

指针与函数

函数指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int sub(int a, int b);

int main() {
//指针函数是函数,指针类型的函数,返回值也是指针
//函数指针是指针,指向函数的指针
int(*mysub)(int a, int b);//函数指针
mysub = sub; //不带括号不带参数的函数名是函数的首地址
int c = mysub(2,1);
// 调用的时候,mysub指向跳转表的sub,然后跳转表指向函数的sub
int d = sub(2, 3);
// 调用的时候,sub也先指向跳转表的sub,然后跳转表指向函数sub
return 0;
}


int sub(int a, int b) {
return a - b;
}

指针函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>

int * ret(int * a);
int main() {
int b[3] = { 1,2,3 };
int a = &b[1];
int * c = ret(a); //这里的c是地址,是a的地址,也就是把函数返回的地址给c
int d = *c; //*c是a的地址的值
return 0;
}

int * ret(int * a) { //传入一个地址作为参数
int b = a; //a为地址
int c = *a; //*a为a的值
return a; //返回的是a的地址
}