指针|学习笔记

简介: 快速学习指针

开发者学堂课程【你的第一门 C 语言课指针】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5477


指针


内容介绍:

一、 指针与指针变量

二、 取址运算符和取值运算符


一、 指针与指针变量

1、指针是 c 语言的精髓部分,没有指针就没有现在简洁紧凑高效的 c 语言作为学习者,对指针的掌握程度直接决定对 C 语言的编程能力。

2、定义指针变量

1)、如果在程序中定义一个变量,那么在程序进行编译的时候,就会根据这个变量的类型在系统中分配对应的长度的空间,通过变量名来访问变量。

2)、通过变量名来访问内存是一个相对较安全的方式,只有定义了变量,才能访问它,这是对内存最基本的认知。

类型名*指针变量

char *pa; //定义一个指向字符型的指针变量

int *pb; //定义一个指向整型的指针变量

要注意不同类型所占空间大小不同,如果指定错误,那么访问时就会出错

指针就是地址的意思,指针变量是存放一个地址,普通变量就是存放一点数据,指针的类型就是存放数据的类型

编译器知道每个地址存放的值,一个地址4个字节,在内存中的值是一个地址

地址称之为指针,而这个存放的值称之为指针变量 

数据在内存中如何存取

图片79.png

在程序中定义一个变量,程序编译时,系统就会根据编译类型在

程序内存中分配对应强度的空间,通过变量名进行访问

内存存储数据:

图片80.png

内存索引单元最小是一个字节,可以想象成一个大型数组,数组有索引下标,内存中称为地址

4个存储单元存储一个整型变量,每个存储单元有一个地址,整形变量就相当于4个字节,变量名是根据程序员的使用而定义的,这就是内存存储数据的真相

只有编译器知道:

a -> 10000

b -> 10001

c -> 10002

d -> 10003

e -> 10004

f-> 10005

g ->10009

想要f的值,就去读取f的地址10005

 

二、 取址运算符和取值运算符

如果需要获取某个变量的地址,可以使用取地址运算符((&):

char *pa= &a;

int *pb = &f;

*pa=3称之为间接访问,

如果需要访问指针变量指向的数据,可以使用取值运算符(*):

直接通过变量来访问,称为直接访问,例如:a=3,就可以直接访问 a 的值。

printf("%c, %d\n", *pa,*pb);

案例:

#include

int main()

{

//定义两个普通变量

char a ='F';

int f =123;

//定义两个指针变量,*代表指针变量

char *pa = &a;//其中地址类型为 char 类型

int *pb = &f ;//f 指向整型

//取pa的值,pa 为指针名字

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

return 0;

}

运行gcc test.c && ./a.out

结果:

a = F

F = 123

间接访问案例:

#include

int main()

{

char a ='F';

int f =123;

char *pa = &a;

int *pb = &f ;

//取pa的值,*为

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

//通过指针间接访问

*pa = 'c';

pb +=1;

printf("now, a = %c\n", pa) ;

printf("now, f = %d\n",*pb);

return 0;

}

运行gcc test.c && ./a.out

结果:

a = F

F = 123

now,a=C

now,f=124

这就是间接访问

sizeof 案例:

#include

int main()

{

char a ='F';

int f =123;

char *pa = &a;

int *pb = &f ;

//取pa的值,*为

printf("a = %%c\n", *pa);

printf("f =%d\n"",*pb);

//通过指针间接访问

*pa = 'c';

pb +=1;

//打印*pa为地址存放的值

printf("now, a = %c\n", *pa) ;

printf("now, f = %d\n",*pb);

printf( "sizeof pa =%d\n"", sizeof( pa));

printf("sizeof pb =%d \n", sizeof ( pb ) ) ;

printf( "the addr of a is : %p\n", pa) ;

printf ("the addr of b is : %p\n", pb) ;

return 0;

}

运行gcc test.c && ./a.out

结果:

a = F

F = 123

now,a=C

now,f=124

sizeof pa

sizeof pb

the addr of a is :0xbf9eff17

the addr of b is :0xbf9eff10

0x开头占16个字节

注意:避免访问未初始化的指针

这就是未初始化的指针

#include

int main( )

{

//定义的一个整型指针,但是并没有分配值,内存就是随机的值

int *a;

//程序终止并且报错

*a = 123;

return 0;

}

这种类似问题是很难排查的。因为从语法上是正确的,但是这个代码又会得到意想不到的结果,所以必须确保他们被初始化了。

下图这种 就是错误的。图片81.png

相关文章
|
2月前
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
17天前
|
编译器 vr&ar C语言
C primer plus 学习笔记 第10章 数组和指针
C primer plus 学习笔记 第10章 数组和指针
|
12月前
|
C++
C++学习笔记_07 const、指针、引用 2021-04-19
C++学习笔记_07 const、指针、引用 2021-04-19
|
存储 Rust JavaScript
Rust学习笔记之智能指针
何为指针 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️ 使用 Box<T> 指向堆上的数据 推荐阅读指数 ⭐️⭐️⭐️⭐️ 使用 Drop Trait 运行清理代码 推荐阅读指数 ⭐️⭐️⭐️⭐️ Rc<T> 引用计数智能指针 推荐阅读指数 ⭐️⭐️⭐️⭐️ RefCell<T> 和内部可变性模式 推荐阅读指数 ⭐️⭐️⭐️⭐️
168 1
Rust学习笔记之智能指针
|
存储 人工智能 C语言
C语言指针学习笔记
C语言指针学习笔记
|
编译器 C语言
【学习笔记之我要C】深入理解数组与指针
【学习笔记之我要C】深入理解数组与指针
36 0
【学习笔记之我要C】指针进阶
【学习笔记之我要C】指针进阶
61 0
|
C语言
【学习笔记之我要C】指针初阶
【学习笔记之我要C】指针初阶
58 0
|
存储
【学习笔记之我要C】初识指针
【学习笔记之我要C】初识指针
39 0
|
编译器 C语言 C++
C语言学习笔记—P26(<C语言高阶>+指针的进阶<4>+题例+图解)
C语言学习笔记(<C语言高阶>+指针的进阶<4>+题例+图解)
67 0
C语言学习笔记—P26(<C语言高阶>+指针的进阶<4>+题例+图解)