C指针和位运算

本文探讨了C语言中的指针概念,包括指针的类型、指针指向的类型、sizeof运算符、指针算数运算、位运算在指针中的应用等。特别提到了指针算术中的n&(n-1)和加减法操作,以及指针在数组、函数和类型转换中的使用,强调了指针类型转换的安全问题。
摘要由CSDN通过智能技术生成

跟据符号顺序依次判断类型

int p; //普通整型

int *p;//带*说明p是一个指针,int说明p是指向整型的指针

int p[3];//带[]说明p是一个数组,int说明数组里存放的是整型元素

int *p[3];//[]说明是数组,*说明数组里的元素是指针,int说明这些指针元素指向整型。所以p是一个储存了整型的指针所组成的数组。

int p(int);//p有()说明是个哈桑农户,函数有一个整型的参数,该函数返回的是整型

int (*p)(int);//*说明p是指针,()说明*p是指向函数的指针


指针的类型和指针指向的类型

int *p;
指针的类型是整型指针;
指针所指向的类型是整型;
int *pi;
*pi=5;
这样是错误的,因为整型指针只是声明但是没有实际的地址,赋值的话只有对象但是没有地址。
int a[3];
int *p,*q;
p=a;
q=&a[2];
这两种都是可以的,(q-p)/sizeof(int)
const char *c = "hello";//常量代码区
char a[] = "hello";//数据区或者栈区
int *ptr;
ptr = (int*)0x8000;
这种随意直接分配地址的方式是十分危险的,因为可能并不知道这些地址指向什么地方

sizeof

char *a = "0123456789";
sizeof(a)
a是一个字符指针,指针的大小是定值,就是4字节
char a[] = "0123456789";
sizeof(a)
a是一个字符数组,数组最初未确定大小,填充后一个字符占一个字节,再加上隐含的\0,所以大小是11
char a[100]="0132465789"
sizeof(a)
a是一个字符数组,由于分配好了大小100,所以这个字符数组就是大小100
int a[100];
sizeof(a)
a是一个整型数组,一个整型的大小是4字节,所以最后整体的大小应该是400
char a[]="a\n"
sizeof(a)
由于\n算作是一个字节,所以最后加上\0大小是三
char var[10];
int test(char var[])
{
   
	return sizeof(var);
}
本来var代表这个数组,其sizeof10,但是由于作为函数参数传入之后,就退化为指针了,指针的大小都是4

指针的值

指针的值是一个地址,在32位程序中是一个32位的整数。指针指向的区域就是,从这个地址开始,然后长度位sizeof的区域,指针就是这个区域的首地址。32位是4个字节大小。指针大小与类型无关,始终是4个字节。变量的大小才会有区别。

指针算数运算

char a[20];
int *ptr = (int *)a;
ptr++;

a是一个字符数组变量,使用(int *)类型转换成了一个整型的指针,方便后面进行运算,因为整型的才能做算数运算;但这里即使不转也可以直接用。
ptr加1,在32位中实际是加4,所以ptr指向的地址由原来的a的低地址向高增加了四个字节,本来ptr是指向数组a的开始的四个字节,此时指向()
int array[20] = {
   0};//注意初始化的格式,后面要么不加初值,要么也是{0}这样加大括号的形式
int *ptr = array;
for(i=0;i<20;i++)
{
   
	(*ptr)++;
	ptr
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值