当前位置:   article > 正文

C语言基础的小知识点:_指针p++和p+1

指针p++和p+1

1.在定义字符串变量时:结尾处会自动添加结束标志‘\0(结尾自动添加,占一个字节)

 依次赋值为字符时,赋几个字符就是几个单位的字节;

ch2[]所占字节数为6;

ch3[]所占字节数为5;

2.在使用指针时,如果不知道指针要指向哪一个地址,就先使用 (数据类型)* p = NULL;

使用空指针就是为了避免野指针的出现,以免造成不必要的引用所造成的损害;

指针所占的内存大小空间固定为8个字节;

        2.1  (数据类型)*(指针名:在定义和初始化的时表示后面的这个变量为指针变量

                        *(指针名):单独使用就是在调用指针所指向地址里的内容

        2.2 p+1和p++的区别:

                p+1:指针的指向没有改变

                p++:指针的指向偏移了一个数据类型单位的地址

        2.3 指针数组和数组指针的理解

        首先:【】的优先级比*的优先级高

                2.3.1        指针数组

                本质是一个数组,数组里面的元素为指针,本身遵循数组的原则,里面的元素又遵循指针的原则;        数据类型 *p [元素个数]    

                2.3.2        数组指针        //方便理解,可以理解为行指针

                本质是一个指针,指针指向的对象是一个一维数组

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 1,b = 2,c = 3;
  5. int *p[3] ={NULL}; //不清楚里面的指针指向的时候就先整成空指针
  6. p[0] = &a;
  7. p[1] = &b;
  8. p[2] = &c;
  9. int *p[3] = {&a,&b,&c}; //清楚就直接给地址
  10. }
  11. /*
  12. int main()
  13. {
  14. Char a[32][32] ={0};
  15. char (*p)[32]= a; //把第一行的首个元素的地址给到p。
  16. }
  17. */

       

3.当定义void空型时,引用必要进行强转

        3.1 强转类型 (数据类型+*)+指针的名字         //使用时必须给定数据类型

                强转类型加赋值 *(数据类型 *)指针名字 = 对应类型的赋值

        3.2 各个数据类型所占的内存空间大小:

                3.2.1:char:1个字节; short:两个字节;int,float:4个字节;double,long:8个字节

  

4.使用const时,要注意使用的对象

        例:

        Const int *p = &a;表示*p为只读模式,p所指向的地址可进行修改。

        Int * const p = &a;表示p为只读模式(指向不可改变),*p(p所指向的地址里的内容)可以改变。

        Const int *const p ;表示p和*p都不可改变。

5. 对数组名的理解:

        1.数组名代表这个数组的首地址,而且是个地址常量,不能被改变;

        例:和指针一起用时,指针的指向就是数组的首地址;

        2.数组名代表整个数组;

           :算数组的大小时sizeof(数组名)

        5.1数组的初始化:

             如果数组进行部分初始化,未初始化的部分会进行自动补0        // '\0' == 0

            二维数组初始化时:    省略初始化只能省略行数,不能省略列数,更不能全部省略。

6.位运算符

位运算时 针对二进制的每一位的运算!!!!!位对位进行按位的与或非运算

        6.1 运算符的优先级:单目运算符 > 双目运算符 >  三目运算符

          单目运算符:就是只存在一个操作数,比如a++,++a,逻辑反 !;

        双目运算符:就是存在两个操作数,比如a+b,a*b, 逻辑或‘ | | ‘(有真为真) ,逻辑与 ’&&‘                 ​​​​​​​         全真为真,有假为假) 

        三目运算符现在只有一个‘?’比如a?b;c当a为真时,执行b,为假时执行c; 

        6.2 判断真假时,只有为0时才为假,非0全为真(只要不是0,就为真);

        6.3 位的清零和置1:

                1.清0通式:将A的第n位清零

                        A & ~( 1<<n);

                2.置1通式:将A的第n位置一 

                        A |1<<n;

7.函数

        7.1输入输出函数

scanf(“格式控制串”,对应变量的地址);以非法字符为结束标志;

        想要使用scanf输入带其他非法字符的字符串,可以使用Scanf(“%[^\n]”,对应变量的地址);    

puts();输入字符串,会读入“\n”,字符数加一;

getchar函数的定义:char a =getchar();        //getchar(),putchar()是单个字符的输入输出

        7.2功能体函数

                7.2.1:递归和回调函数

                ​​​​​​​        递归函数:

                ​​​​​​​        1.直接或间接的调用自己,自己调用自己就是递归函数了

                ​​​​​​​        2.必须满足的条件:

                ​​​​​​​        1):必须有一个终止处理或计算的准则。

                ​​​​​​​        (2).在每一次调用自己时,必须更接近于要返回的解。

                ​​​​​​​        回调函数:

                ​​​​​​​        ​​​​​​​ 回调函数就是:一个通过函数指针调用其他函数的函数。如果你把函数的指针(地址)作为 参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是  回调函数。(调用其他的函数

        7.3 常用的函数----头文件:#include <string.h>

             1.   测量净长度的函数不包括'\0':strlen:int (变量名)= strlen(要测量的变量的首地址)

        注意:strlen的返回值为整形数值 输出格式%d;

             2.strcpy:复制函数覆盖原来地址的内容)【strcpy(str1,str2)】

             3.Strcat(连接(追加)函数)同复制函数的操作方法 

             4.Strstr (找到所要字符串在目标字符串的首次出现的地址;)

        :「arr =“handsome”;arr1 =“some”;

        Strstr(arr,arr1);在arr中找到arr1的出现位置(地址);返回值类型是地址,如果没有找到,就返回NULL(空);

        7.4 结构体                ​​​​​​​

                结构体:(注意数据类型所用的空间,空间不够可以用数组或指针)是一个可以存放多种数据类型的数据;

定义方法:

        typedef struct +结构体名

        {

        成员表1;(数据类型加上变量名;)

        成员表2;

        。。。。。(每个成员的数据类型可以不同)

        }+结构体变量名(调用直接调用此处的变量名结尾这里的分号不能省略)

                ​​​​​​​7.4.1 结构体大小的计算:

                ​​​​​​​        1. 计算每一个成员存储空间的大小,按照字节序对齐的方式;

                          字节序对齐:如果成员的最大存储空间>=8,按照8字节对齐;:如果成员的最大存储空间<=8,按照最大成员的数据类型的字节对齐;

                        2. 定义时 同一char或short类型不连续定义的会分别开辟内存空间;同时遵循偶数地址存储的原则;

  1. typedef struct test1
  2. {
  3. int a;
  4. char b;
  5. int c;
  6. short d;
  7. }T;
  8. typedef struct test2
  9. {
  10. int a;
  11. int c;
  12. short d;
  13. char b;
  14. }T1;
  15. //此时T和T1开辟空间大小就不相同,开辟空间是连续的,short占两个字节,剩下的两个内存空间会给到下一个char型(char只占一个字节空间),存放遵循偶数地址存储的原则

        7.5 共用体union

        共用体与结构体的区别

                1.开辟空间的大小不一样:共用体只计算最大成员的大小,但也遵循字节序对齐的方式;

                2.存储方式不同:共用体共用一片空间地址,只能一个一个存储;

        7.6 参数的传递                

        1. 值传递

                例:加函数代码

        2.地址传递

                *地址具有唯一性*

        3. 数组的传递:(传递的是数组的首地址)

                数组传数组

                数组传指针

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/79748
推荐阅读
相关标签
  

闽ICP备14008679号