如何理解指针与数组的关系 队列,堆栈与数组,链表的关系与区分?
队列,堆栈与数组,链表的关系与区分?
堆栈和队列都可以用数组和链表来实现!广义来说,栈也是队列!两者都是顺序表结构!
栈也叫FIFO队列,也可以叫LIFO队列,队列也叫FIFO队列!这两个统称为单输入单输出队列!
堆栈属于单端队列!队列是单进单出的,d:堆栈(LIFO或FILO)、队列(FIFO)和双入双出队列(deque)是队列的三种形式。Stack是单端队列,先入后出!单输入单输出队列的D
指针数组?
如果指针数组* str[5] { "jjjjj ", "kkhjfg ", "jkjgh ", "kjjjk "和 "llljg "}被使用,为什么这里的str[i]代表每个字符串,为什么可以作为函数参数?望指教!
可以调试一下看看:
命名变量str指向内存地址,该地址是指针数据的第一个地址;
str[0]的值是数组中第一个字符串的第一个地址;
str[1]的值是数组中第二个字符串的第一个地址;
您可以通过调试来查看这些命名变量的地址。
不看内存地址怎么理解指针?
指针的本质是一个地址的解释!
Char*编译器将A指向的地址解释为字符。
假设A指向内存地址0x0001,地址0x0001存储0x61 0x62 0x63。编译器如何解释*a?
编译器会看到a的类型是char,也就是只看这个地址的1个字节,所以编译器解释* a a.
指针类型是告诉编译器如何解释指针变量值所指向的地址。
一直没明单片机C语言的指针这块内容,在什么情况下会用到指针呢?
作为一个长期使用C语言的,我来回答一下C语言指针的问题。
首先,C语言指针的本质是什么?C语言指针的本质是内存变量,也就是内存单元的个数。存储单元以字节为单位。所以指针是字节数。如下图所示,一个4G内存的编号,指针的值其实就是内存编号。
其次,明确了变量和指针的关系对应的是具体的内存,变量的内容就是内存中存储的数字。根据。
比如我们定义一个变量uint8_t a10,如果a的位置是0,也就是上图中0的位置存储在内存中的数据是10;
让 让我们再看看指针,定义指针uint8_t * ba。我们知道含义是取地址,那么根据上面假设变量A位于地址0,那么A就是0,指针变量B的值就是0。
如果你不 不理解指针定义uint8_t * ba,我们可以做一个改动:
(uint8_t *) b a,很容易理解(uint8_t *)是一种新的数据类型。事实上,在我们实际的编程中,通常将其定义为typeof uint8_t * uint8_p _ p。
uint8_p b
这样,B更像一个变量,更容易理解。
第三,指针单元和内存指针。每个单元代表多少内存?这取决于指针的类型。
比如char * a,short int * b,int * c,long int * d等。
指针指的是每个内存的编号,有1字节,2字节,4字节,8字节,也就是每个变量类型占用的内存单元。
假设A、B、C、D四个指针的变量值都是100。自加后指针的值是多少?
a;
b;
c;
d;
你能猜出a,b,c,d的值是多少吗?
答案是:101,102,104,108。
也就是指针每次移动对应一个变量类型的内存量,这个可以通过keil开发环境上的仿真环境来验证,有兴趣的可以自己验证。
最后,指针的优势和应用场景:1。效率高;2.灵活,可以在任何位置访问内存数据;3.作为函数参数,只需要传递4个字节,比数组值传递节省内存复制时间。
应用场景:1。交换函数中两个变量的值。
学习一个函数的时候,交换两个数的值,做一个swap函数,传入值,或者交换两个值,没问题,但是没有swap就没用了。为什么?因为传入了两个值。如果指针被传递就没有问题。因为指针传递了两个变量的地址,所以变量的位置保持不变。
2.该函数通过指针返回多个值。
3.函数返回操作的状态,结果通过指针返回。
…………
指针的缺点指针是C语言的灵魂。一般来说,C语言是a "低级 "语言,这也很大程度上是因为C语言指针的问题。c语言指针允许开发人员在任何内存位置访问数据。这是其他声音可以做到的。;无法实现。正是因为有了指针,C语言也容易出错。最常见的问题是地址越界。如果地址越界,读写一些不该读写的东西会直接导致系统崩溃,这个问题很难定位,因为语法上是这样的没有编译时检测不到的错误。
如果对C语言的指针有什么意见,欢迎留言讨论。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。