复习:
-
什么是指针?
也叫地址address,就是内存块的首位置,英文名叫painter。他是一个常量,指针不能被赋值,不能自增自减,例如:数组名就是内存块首地址,他就是一个指针常量。Int a=10,&a就是首地址,是指针常量;
-
什么是指针变量?
顾名思义,存放指针(地址)数据的变量,也叫地址变量。就是保存内存块首地址的数据的,例: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个字节;
-
*p的含义:
点找块(根据p代表的地址值,找对应类型的内存块)
注意:
-
- p为null,*p会崩溃
- 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;
}
-
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;
}
-
支持的运算:
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 *和& : 支持
标签:10,0000,2024.7,int,23,笔记,printf,include,指针 From: https://blog.csdn.net/qq_54937403/article/details/140647687