C语言-详解指针


目录

一.内存

        1.内存的定义

        2.内存的结构图

二.地址

        1.什么是地址

        2.什么是变量的地址

三.什么是指针

        1.指针的定义

四.如何获取数据存储空间的地址

        1.&运算符

五.指针变量

        1.什么是指针变量(一级指针变量)

        2.指针变量的定义                

       3.指针变量的大小

六.指针变量的大小

七.使用指针变量

        1.*运算符

          2.为什么需要使用地址                

八.指针的运算

        1.指针 +- 整数

        2.指针-指针

        

        3.指针的关系运算                

九.野指针

        1.什么是野指针

        2.野指针的成因

        3.如何避免野指针

十.指针和数组

十一.二级指针

        1.什么是二级指针

        2.二级指针变量的声明

十二.指针数组

        1.什么是指针数组

        2.指针数组的定义

          3.指针数组的使用                

十三.字符指针

        1.什么是字符指针

        2.字符指针的使用

十四.数组指针

        1.什么是数组指针

        2.什么是整个数组的地址

        3.如何保存数组的地址

        4.数组指针变量的定义

        5.数组指针的使用

        6.区别数组,指针数组,数组指针,数组指针数组

        7.指针数组和数组指针数组的使用

十五.数组传参和指针传参

        1.数组传参

        2.指针传参

 十六.函数指针

        1.什么是函数指针

        2.函数指针变量                

        3.函数指针变量的使用

十七.函数指针数组

        1.函数指针数组的定义

        2.函数指针数组的使用

十八.指向函数指针数组的指针

        1.定义                

十九.回调函数

        1.定义

        2.回调函数的使用

二十.指针笔试题


一.内存

        1.内存的定义

                内存(Memory)是计算机的重要部件,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。

                计算机中常用的内存的大小是 4g/8g/16g

                程序在运行前会先加载到内存中,也会使用内存。

        2.内存的结构图

                C++-内存的结构图-CSDN博客

                一个字节是8个bit位。 

二.地址

        1.什么是地址

                地址是指内存中一个最小单元的编号。    

      

        2.什么是变量的地址

                变量的存储空间的首字节的地址就是整个变量的地址。

                 一个例子:以int类型的变量为例子

                

三.什么是指针

        1.指针的定义

                指针指的是内存中一个最小单元的编号。

                所以我们在提到指针的概念的时候可以认为指针就是地址。

  

四.如何获取数据存储空间的地址

        1.&运算符

                &地址运算符又称取地址运算符,&运算符的运算对象是变量,将变量数据的存储空间的地址叫做表达式的派生值。

                在C语言中我们用%p来作为地址的转换说明。

                那么此时我们获取到的相应类型的地址数据应该保存到什么类型的变量中呢?

五.指针变量

        1.什么是指针变量(一级指针变量)

                指针变量是一个变量,变量中的内容保存的是存储相应类型的存储空间的首字节地址。

                 我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量。

        2.指针变量的定义                

#include <stdio.h>int main(void)
{int number = 10;int* ptr_number = &number;printf("number的地址:%p\n", &number);printf("ptr_number中保存的数据:%p\n", ptr_number);return  0;
}

             

                *ptr_number表明ptr_number这个变量是一个指针变量,该变量中保存的数据是保存int类型数据的存储空间的编号,也就是地址。

                此时就会有疑问,为什么我们通过变量名number也可以得到我们想要的数据,为什么还需要通过地址来访问存储空间,从而得到我们想要的数据。

        

       3.指针变量的大小

        在32位操作系统下                         在64位操作系统下        

        为什么在不同位的操作系统下,同样的代码同样的指针变量却有不同的结果呢?

六.指针变量的大小

        上面我们说到指针变量中保存的是存储空间的地址,那么指针变量在不同的平台下所占的字节数不同,也就说明了在不同的平台下我们的地址这个数据的大小不同。 

        对于32位平台下:

                对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);

                那么32根地址线产生的地址就会是:
                        0000 0000 0000 0000 0000 0000 0000 0000
                        0000 0000 0000 0000 0000 0000 0000 0001
                        ...
                        1111  1111  1111  1111 1111  1111  1111  1111

                所以我们要保存32位bit位的地址数据,那么我们就需要用4个字节来保存。

                所以在32位平台下指针变量的大小都是4字节。无论保存什么样类型的数据。 

        对于64位平台下同理。

七.使用指针变量

        1.*运算符

                *运算符又称解引用运算符(间接运算符),*运算符的运算对象是指针变量或地址,

通过它得到的表达式的派生值是地址中保存的相应类型的数据。

#include <stdio.h>int main(void)
{int number = 10;int* ptr_number = &number;printf("number=%d\n", number);printf("*ptr_number=%d\n", *ptr_number);return  0;
}

                       

          2.为什么需要使用地址                

#include <stdio.h>void Swap(int number_a, int number_b)
{int number_tmp = 0;number_tmp = number_a; number_a = number_b;number_b = number_tmp;
}int main(void)
{int number_a = 10;int number_b = 20;printf("两数交换前分别为number_a = %d number_b = %d\n", number_a, number_b);Swap(number_a, number_b);printf("两数交换后分别为number_a = %d number_b = %d\n", number_a, number_b);return 0;
}

                 此时我们运行代码发现两数并没有交换:


                        原因就是此时我们传入函数的就是一个值而已,在我们主调函数中的值并没有改变。

        解决办法:

                上面我们提到了地址是存储空间的编号,那么我们将变量的地址传入到函数中,不就可以直接对存储空间中的数据进行更改了。

#include <stdio.h>void Swap(int* ptr_number_a, int* ptr_number_b)
{int number_tmp = 0;number_tmp = *ptr_number_a; *ptr_number_a = *ptr_number_b;*ptr_number_b = number_tmp;
}int main(void)
{int number_a = 10;int number_b = 20;printf("两数交换前分别为number_a = %d number_b = %d\n", number_a, number_b);Swap(&number_a, &number_b);printf("两数交换后分别为number_a = %d number_b = %d\n", number_a, number_b);return 0;
}

八.指针的运算

        1.指针 +- 整数

int main(void)
{int a = 10;int* ptr_a = &a;printf("a变量的地址是:%p\n", &a);printf("ptr_a:%p\n", ptr_a);printf("ptr_a + 1:%p", ptr_a + 1);return 0;
}

           

        从上图我们可以看出,指针+-整数并不是单纯的数值上面的累加,而是跳过整数倍个该类型所占的字节数。

        int* ptr:

                *ptr表明ptr变量是指针变量,所以这个变脸中保存的数据是一个地址,该地址所标识的存储空间中的数据是一个int类型的数据。

                所以我们在声明一个变量是指针变量的时候,*表明这个变量是一个指针变量,而指明数据类型,是为了保证我们在处理指针变量的时候,结果的正确。 

        2.指针-指针

                指针-指针的前提条件是两个指针变量指向同一段连续的存储空间上。不同的存储空间上计算出来的结果没有意义。

                指针-指针的结果是两个地址之间的元素个数。                

int main(void)
{int numbers[10] = { 0 };int* ptr_numbers_start = numbers;int* ptr_numbers_end = numbers + 10;printf("%d\n", ptr_numbers_end - ptr_numbers_start);return 0;
}

               

        

        3.指针的关系运算                

int main(void)
{int numbers[3] = { 1,2,3 };int* ptr_numbers_start = numbers;int* ptr_numbers_end = numbers + 3;while (ptr_numbers_start < ptr_numbers_end){printf("%d ", *ptr_numbers_start);ptr_numbers_start++;}printf("\n");return 0;
}

         注意:

                C语言中只保证了给数组分配空间时,指向数组后面的第一个位置的指针仍然是有效指针。不允许与指向数组第一个元素的前一个位置的指针进行比较。

九.野指针

        1.什么是野指针

                概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。

        

        2.野指针的成因

                  没有对指针变量进行初始化

#include <stdio.h>
int main()
{ int *p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

                 指针越界访问

#include <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

                对空指针进行解引用

int main(void)
{int* ptr = NULL;*ptr = 11;return 0;
}

        3.如何避免野指针

                a. 指针初始化
                b. 小心指针越界
                c. 指针指向空间释放,及时置NULL
                d. 避免返回局部变量的地址
                e. 指针使用之前检查有效性     
   
#include <stdio.h>
int main()
{int *p = NULL;//....int a = 10;p = &a;if(p != NULL){*p = 20;}return 0;
}

十.指针和数组

        先看一个例子:                

#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,0};printf("%p\n", arr);printf("%p\n", &arr[0]);return 0;
}

        通过观察上图我们可以得出结论:

                数组名是数组首元素的地址。

十一.二级指针

        1.什么是二级指针

                二级指针是指一级指针变量的地址。

        2.二级指针变量的声明

                int ** pptr;

                        *pptr表明pptr这个变量是指针变量,这个变脸中保存的数据是一个地址数据,这个地址指向的存储空间中保存的数据是一个int*类型的数据。 

十二.指针数组

        1.什么是指针数组

                顾名思义就是一个数组中的每个元素都是指针类型的。

        2.指针数组的定义

                int * ptrs[10];

                ptr[10]表明此处是声明一个数组,该数组有10个元素,int*表明这个10个元素每一个都是int*的指针变量。

        

          3.指针数组的使用                

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

十三.字符指针

        1.什么是字符指针

               保存char类型数据的存储空间的地址。

        

        2.字符指针的使用

int main()
{char ch = 'w';char *pc = &ch;*pc = 'w';return 0;
}
int main()
{const char* pstr = "hello bit.";//这里是把一个字符串放到pstr指针变量里了吗?printf("%s\n", pstr);return 0;
}

                对于代码 const char* pstr = "hello bit.";的解释:

                        ”hello bit“是字符串字面量,这里”hello bit“表示的其实是字符串首元素的地址。这里是将这个字符串首元素的地址放到了pstr中。

        一道笔试题:            

#include <stdio.h>
int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";const char *str3 = "hello bit.";const char *str4 = "hello bit.";if(str1 ==str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if(str3 ==str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

        这里首先函数声明了str1和str2两个字符数组,然后将字符串“hello bit.”拷贝到数组空间中,数组名表示数组首元素的地址,同时str1和str2又是两个不同的数组,所以str1不等于str2。但是对于str3和str4这两个指针数组来说,因为字符串字面量是保存在内存的常量区的空间是不会改变的,所以str3和str4所获取的地址是相同的。

十四.数组指针

        1.什么是数组指针

                首先数组指针是一个指针,这个指针是整个数组的地址。

       

        2.什么是整个数组的地址

                数组名表示的是数组首元素的地址,那么此时对数组名取地址,得到的就是整个数组的地址。

        3.如何保存数组的地址

                前面我们提到过指针也就是地址,要保存在指针变量中,那么数组指针也不例外,也因该保存在数组指针变量中。

                

        4.数组指针变量的定义

#include <stdio.h>
int main()
{int numbers[10] = { 0 };int(*ptr_numbers)[10] = &numbers;return 0;
}

        首先*ptr_numbers表明ptr_numbers这个变量一个指针变量,该指针变量的类型是一个有10个int元素组成的数组该指针变量中保存的数据是一个10个元素数组的地址

        5.数组指针的使用

#include <stdio.h>void Print(int (*ptr_numbers)[4], int r, int c)
{int i_i = 0;int i_j = 0;for (i_i = 0; i_i < r; i_i++){for (i_j = 0; i_j < c; i_j++){printf("%d ", *(*(ptr_numbers + i_i) + i_j));}printf("\n");}
}int main(void)
{int numbers[3][4] = { {1, 2, 3, 4}, {4, 5, 6, 7} ,{7, 8, 9, 10} };Print(numbers, 3, 4);return 0;
}

        6.区别数组,指针数组,数组指针,数组指针数组

int arr[5];
int *parr1[10];
int (*parr2)[10];
int (*parr3[10])[5];

        7.指针数组和数组指针数组的使用

#include <stdio.h>int main(void)
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr3[10] = { 1,2,3,4,5,6,7,8,9,10 };//整型指针数组int* ptr[3] = { arr1, arr2, arr3 };//数组指针数组int(*ptrs[3])[10] = { &arr1, &arr2, &arr3 };//遍历数据//整型指针数组的遍历int i_i = 0;int i_j = 0;for (i_i = 0; i_i < 3; i_i++){for (i_j = 0; i_j < 10; i_j++){printf("%d ", ptr[i_i][i_j]);}printf("\n");}printf("\n");//数组指针数组的遍历int i_z = 0;for (i_i = 0; i_i < 3; i_i++){for (i_j = 0; i_j < 10; i_j++){printf("%d ", (*(ptrs[i_i]))[i_j] );}printf("\n");}printf("\n");return 0;
}

十五.数组传参和指针传参

        1.数组传参

                一维数组:          

#include <stdio.h>void test1(int arr[10])
{}
void test1(int arr [])
{}
void test1(int* arr)
{}void test2(int *arr[20])
{}
void test2(int* arr[])
{}
void test2(int **arr)
{}int main(void)
{int arr1[10] = { 0 };int* arr2[20] = { 0 };test1(arr1);test2(arr2);return 0;
}

                二维数组:

#include <stdio.h>void test(int arr[3][5])
{}
void test(int arr[][5])
{}
void test(int (*arr)[5])
{}int main(void)
{int arr[3][5] = { 0 };test(arr);return 0;
}

       

        2.指针传参

                一级指针传参:

#include <stdio.h>
void print(int *p, int sz)
{int i = 0;for(i=0; i<sz; i++){printf("%d\n", *(p+i));}
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9};int *p = arr;int sz = sizeof(arr)/sizeof(arr[0]);//一级指针p,传给函数print(p, sz);return 0;
}

                       当一个函数的形数是一个一级指针的时候可以收什么样的实参呢?

                        数组名,变量的地址,一级指针变量。

                二级指针传参:

#include <stdio.h>
void test(int** ptr)
{printf("num = %d\n", **ptr); 
}
int main()
{int n = 10;int*p = &n;int **pp = &p;test(pp);test(&p);return 0;
}

                        当一个函数的形数是一个二级指针的时候可以收什么样的实参呢?

                                二级指针变量,一级指针变量的地址,一级指针数组的数组名。

 十六.函数指针

        1.什么是函数指针

#include <stdio.h>
void test()
{printf("hehe\n");
}
int main()
{printf("%p\n", test);printf("%p\n", &test);return 0;
}

               

        输出的是两个地址,这两个地址是 test 函数的地址。
        那我们的函数的地址要想保存起来,怎么保存?

        2.函数指针变量                

void test()
{printf("hehe\n");
}
//下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();

        分析一下两段代码:

//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);

                代码1:

                        (void (*)())0是将0强转类型转换为函数指针,(*0)() 是调用函数。

                代码2:

                        首先(*signal(int , void(*)(int)))是一个函数,该函数的返回值类型是void(int)。

                代码2太复杂,如何简化:

typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);

       

        3.函数指针变量的使用

#include <stdio.h>
void test()
{printf("hehe\n");
}
int main()
{void (*ptr_test)() = test;ptr_test();return 0;
}

十七.函数指针数组

        1.函数指针数组的定义

int (*parr1[10])();

        2.函数指针数组的使用

                函数指针数组的用途:转移表

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a*b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input = 1;int ret = 0;int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表while (input){printf( "*************************\n" );printf( " 1:add           2:sub \n" );printf( " 3:mul           4:div \n" );printf( "*************************\n" );printf( "请选择:" );scanf( "%d", &input);if ((input <= 4 && input >= 1)){printf( "输入操作数:" );scanf( "%d %d", &x, &y);ret = (*p[input])(x, y);}elseprintf( "输入有误\n" );printf( "ret = %d\n", ret);}return 0;
}

十八.指向函数指针数组的指针

        1.定义                

                指向函数指针数组的指针是一个 指针
                指针指向一个 数组 ,数组的元素都是 函数指针 ;
void test(const char* str)
{printf("%s\n", str);
}
int main()
{//函数指针pfunvoid (*pfun)(const char*) = test;//函数指针的数组pfunArrvoid (*pfunArr[5])(const char* str);pfunArr[0] = test;//指向函数指针数组pfunArr的指针ppfunArrvoid (*(*ppfunArr)[5])(const char*) = &pfunArr;return 0;
}

十九.回调函数

        1.定义

                回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

        2.回调函数的使用

二十.指针笔试题

                C语言-指针笔试题详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Http中post和get

get产生一个tcp数据包&#xff0c;服务器只响应一次&#xff0c;而post请求服务器会响应两次&#xff08;第一次发送请求头响应100&#xff0c;再次响应返回200&#xff0c;成功

高性能、低功耗并附带RAM的涓流充电实时时钟电路芯片D1302的描述

D1302是一块高性能、低功耗并附带RAM的涓流充电实时时钟电路。 主要特点&#xff1a; ● 实时时钟可提供秒、 分、小时、星期、日期、月 份和年等计时数据&#xff0c;到2100 年止。一个月小于31天时可自动调整&#xff0c;且具有闰年补偿功能 ● 31X8 位通用暂存RAM ● 采用…

vue中的动画组件使用及如何在vue中使用animate.css

“< Transition >” 是一个内置组件&#xff0c;这意味着它在任意别的组件中都可以被使用&#xff0c;无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发&#xff1a; 由 v-if 所触发的切换由 v-show 所触…

单机无锁线程安全队列-Disruptor

Disruptor 1、基本介绍 说到队列&#xff0c;除了常见的mq中间件&#xff0c;java中也自带线程安全的BlockingQueue&#xff0c;但是BlockingQueue通过在入队和出队时加锁的方式避免并发操作&#xff0c;性能上会大打折扣。 而Disruptor是一个线程安全、低延迟、吞吐量高的队…

SpectralGPT: Spectral Foundation Model 论文翻译3

遥感领域的通用大模型 2023.11.13在CVPR发表 原文地址&#xff1a;[2311.07113] SpectralGPT: Spectral Foundation Model (arxiv.org) E.消融研究 在预训练阶段&#xff0c;我们对可能影响下游任务表现的各种因素进行了全面研究。这些因素包括掩蔽比、ViT patch大小、数据规…

多线程--11--ConcurrentHashMap

ConcurrentHashMap与HashMap等的区别 HashMap线程不安全 我们知道HashMap是线程不安全的&#xff0c;在多线程环境下&#xff0c;使用Hashmap进行put操作会引起死循环&#xff0c;导致CPU利用率接近100%&#xff0c;所以在并发情况下不能使用HashMap。 ConcurrentHashMap 主…

Linux信息收集

Linux信息收集 本机基本信息 #管理员 $普通用户 之前表示登录的用户名称&#xff0c;之后表示主机名&#xff0c;再之后表示当前所在目录 / 表示根目录 ~表示当前用户家目录1、内核&#xff0c;操作系统和设备信息 uname -a 打印所有可用的系统信息 uname -r 内核版本 u…

01_阿里云_Xshell连接服务器

PC使用Xshell连接阿里云服务器 问题引出 之前使用Xshell连接阿里云服务器连接的好好的&#xff0c;今天准备上去服务器学习Linux发现连不上了&#xff0c;后来发现是防火墙的问题&#xff0c;还有阿里云的安全组也需要设置 解决方案 方法一&#xff1a;&#xff08;简单粗暴…

3D模型材质编辑

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 如今&#xff0c;3D 纹理、打印和建模都非常流行。使用可用的高级工具&#xff0c;创建 3D 模型…

基于Git的代码工程管理——学习记录一

一、Git简概[1] Git是一个分布式版本控制系统&#xff0c;它跟踪任何一组计算机文件的更改&#xff0c;通常用于在软件开发过程中协调协作开发源代码的程序员之间的工作。其为实现快速、数据完整性以及分布式非线性工作流程&#xff08;在不同计算机上运行数千个并行分支&#…

钉钉提交审批意见,并上传附件接口集成

一&#xff1a;适配器 DingtalkApprovalFilesExecute 参考方案链接&#xff1a;轻易云数据集成平台 二&#xff1a;请求接口。配置参数 接口文档&#xff1a;使用了新旧接口 服务端API发起带有附件的审批流并下载附件 - 钉钉开放平台 接口&#xff1a;topapi/processinsta…

Python编程技巧:多层for循环的高级应用

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python的for循环结构是编程中最基础也是最常用的控制结构之一。通过for循环&#xff0c;可以轻松遍历数据集合和执行重复的操作。然而&#xff0c;当我们面对多层for循环时&#xff0c;性能和可读性可能会成为挑…

Redis的三种消息队列实现方式

目录 前言 List实现消息队列 PubSub消息队列 Stream消息队列 三种实现方式对比 前言 为什么要使用Redis的消息队列&#xff1f; 成本低&#xff0c;对于RabbitMQ或是Kafka来说&#xff0c;已经是重量级的消息队列。 Redis的三种实现方式&#xff1a; List结构&#xff1…

【安卓12源码】WMS系列:addWindow 和 removeWindow流程

一、Window 的属性 Window的属性定义在WindowManager的内部类LayoutParams中&#xff0c;了解Window的属性能够更好的理解WMS的内部原理。Window的属性有很多种&#xff0c;与应用开发最密切的有三种&#xff0c;它们分别是Type(Window的类型)、Flag(Window的标志)和SoftInputM…

SMART PLC温度采集模块温度转换FC(梯形图+SCL代码)

对于模拟量输入采集,温度变送器等我们可以利用线性转换功能块完成温度采集,西门子PLC有温度采集模块,利用温度采集模块采集温度我们的转换关系无需进行线性变换,下面我们具体介绍。温度采集线性转换功能块请参考下面的文章链接: https://rxxw-control.blog.csdn.net/arti…

Hadoop学习笔记(HDP)-Part.06 安装OracleJDK

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

外包干了8个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

HarmonyOS带大家创建自己的第一个Page页面并实现路由跳转

我们 在开发过程中 经常会看到 被 艾特修饰的代码 有限像 java中的注解 在 harmonyOS 中 这叫 装饰器 被关键字装饰取来的代码 会具备某某功能 我们这里先来创建一个新的界面 在pages 目录下 右键 如下图 选择page创建 这里 我们取名叫 AppView 然后点击右下角 Finish 这样…

P1006 [NOIP2008 提高组] 传纸条

洛谷的题 网址&#xff1a;P1006 [NOIP2008 提高组] 传纸条 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 还是动态规划&#xff0c;这题和我上一篇博客写的题差不多 区别在于&#xff0c;这个地图不再是方阵&#xff0c;路线不能交叉&#xff0c;而且地图的大小可能大得多…

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…