2024.7.23 c语言学习笔记

复习:

  1. 什么是指针?

   也叫地址address,就是内存块的首位置,英文名叫painter。他是一个常量,指针不能被赋值,不能自增自减,例如:数组名就是内存块首地址,他就是一个指针常量。Int a=10,&a就是首地址,是指针常量;

  1. 什么是指针变量?

顾名思义,存放指针(地址)数据的变量,也叫地址变量。就是保存内存块首地址的数据的,例:int * p,p存放保存int型内存块的地址。

指针变量的初始化

指针变量与其它变量一样,在定义时可以赋值,即初始化。也可以赋值“NULL”或“0”,如果赋值“0”,此时的“0”含义并不是数字“0”,而是 NULL 的字符码值。

指针与整数的加减运算

1指针变量的自增自减运算。指针加 1 或减 1 运算,表示指针向前或向后移动一个单元(不同类型的指针,单元长度不同)。这个在数组中非常常用。

2指针变量加上或减去一个整形数。和第一条类似,具体加几就是向前移动几个单元,减几就是向后移动几个单元。

注意:2.1未经初始化的指针变量禁止使用。例:

     #include <stdio.h>
int main(){
    int a = 0;
    int * p = &a;
    scanf("%d",p);
    printf("d",*p);
    return 0;
}

   

2.2把谁的地址赋值给指针变量,指针变量保存了谁的地址,我们就说指针变量指向了谁。例:

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

2.3在32位系统下,所有指针变量都是4个字节;

             64位系统下,所有指针变量都是8个字节;

  1. *p的含义:

     点找块(根据p代表的地址值,找对应类型的内存块)

注意:

    1.  p为null,*p会崩溃
    2.  p为乱值,*p会崩溃

2.p+n(地址值+整型数 )

     表示p代表的地址向偏移n个存储单元得到的地址值。

     在连续空间中,两个地址相减等于间隔内存单元的个数。

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

  1.  P[n]的含义:

     表示p代表的地址第n个内存块

#include <stdio.h>
int main(){
    int a[10] = {1,2,3,4,5};
   int * p = a;
   p[2]=100;
   *(p+3)=50;
    printf("%d\n",a[2]);
    printf("%d\n",a[3]);
    return 0;
}

  1. 支持的运算:

     6.1算术运算符:

     

+

两个地址相加无意义,地址+-整型数有意义

-

两个地址相减有意义,表示间隔内存单元个数

*

无意义

/

%

     6.2自增自减:

指针常量例如数组名,不能自增自减,指针变量可以自增自减

#include <stdio.h>
int main(){
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int * p = a;
    *(p++);
    (*p)++;
    *(p++);
    (*p)++;
    for(int i=0;i<10;i++){
        printf("%d",a[i]);
    }
    return 0;
}

6.3强制类型转换:支持

6.4关系运算:     支持

6.5 逻辑运算:&& ||   支持p为null为假,非空为真

6.6三目运算:    支持

6.7赋值:      支持

6.8逗号:      支持

6.9位运算:    不支持

&

|

 ^

<<

 >>

 ~

【】

*

&

8

10

9

5

5

2

2

2

2

这个对应比特位运算

&:位与,两个为1则为1,其他为0;

| :位或,只要有1,则为1,否则为0;

^ :异或,相同为0,不同为1;

<< :左移,左移n位,等于原数乘以2的n次方;

>>:右移,,右移n位,等于原数除以2的n次方;

~ :按位取反

6.10 sizeof:    支持 8/4

6.11 【】:     支持

6.12  *和& :  支持

应用场景

(1)判断一个数是不是2的n次方

#include <stdio.h>

int main(){

    int a = 0;

    scanf("%d",&a);

    if ((a&(a-1) )== 0){//必须加括号,否则优先级不对

        printf("是");

    }else{

        printf("不是");

    }

}

例如a=8

a   0100

a-1 0011

&  0000 0

(2)用你所知道的最快的算法,计算一个无符号整型数中有多少个1

1145

a:     0000 0100 0111 1001

a – 1 : 0000 0100 0111 1000

&:    0000 0100 0111 1000

a:    0000 0100 0111 1000

a-1:  0000 0100 0111 0111

&:    0000 0100 0111 0000

a:    0000 0100 0111 0000

a-1:  0000 0100 0110 1111

&:    0000 0100 0110 0000

#include <stdio.h>
int main(){
    int c = 0;
    int n = 0;
    scanf("%d",&n);
    while(n){
      n &= (n-1);
      ++c;
    }
    printf("%d",c);
    return 0;
}

(3) 把一个无符号整型数第七第八位置1,其他位不变。

#include <stdio.h>

int main(){

    unsigned int a = 0XFF000000;

    a |= (3<<7);

    printf("%#x",a);

    return 0;

}

(4)把一个无符号整型数第七第八位置0,其他位不变。

#include <stdio.h>

int main(){

    unsigned int a = ;//

    a = a & ~ (3<<7);



    printf("%#u",a);

    return 0;

}

(5)把一个无符号第七八九十位取出,并用%x输出

1145

a:     0000 0100 0111 1001

#include <stdio.h>

int main(){

    unsigned int a = 0;

    scanf("%u",&a);

    printf("%#x",(a>>7)&0xf);

}

//用指针法实现:输入10个数,找最大值

#include <stdio.h>

int main(){

    int a[10]={0};

    int * p = a;

    for(p = a;p<a+10;p++){

        scanf("%d",p);

    }int max = * p;

    for(p=a+1;p<a+10;p++){

        max = max < * p ? * p : max;

    }

    printf("%d",max);

    return 0;

}

//用下标法实现:输入10个数,找最大值

#include <stdio.h>

int main(){

    int a[10]={0};

    for(int i = 0;i<10;i++){

        scanf("%d",&a[i]);

    }int max = a[0] ;

    for(int i = 0;i<10;i++){

        max = max < a[i]  ? a[i]  : max;

    }

    printf("%d",max);

    return 0;

}

//两个整数之间的汉明距离
 

#include <stdio.h>
int main(){
    int x = 0;
    int y = 0;
    int c = 0;
    int n = 0;
    scanf("%d,%d",&x,&y);
    n = x^y;
    while(n){
        n &=(n-1);
        ++c;

    }

    printf("%d",c);
    return 0;
}

6.10 sizeof:    支持 8/4

6.11 【】:     支持

6.12  *和& :  支持

  

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值