指针加减运算

#include <stdio.h>
#include <stdlib.h>
//字符数组
/*指针是4字节
//指针+指针 错误 (指针之间相加无限大,内存崩溃,所以指针+指针是不可能
//指针-指针 得到之间间隔的单元个数。1、算出间隔的字节数,2、除以调整的权重

int main()
{
 int arr[10] = {};//x       //       可以设arr[]的起始地址是x
 int *p = &arr[1];//x+4        指针是4个字节,其arr[1]字节数是x+4
 int *q = &arr[9];//x+36       其arr[9]字节数是x+36
 printf("%d\n",p-q);//-8     ( ( x+4)-(x+36))/4 
 printf("%d\n",q-p);//8
 printf("%d\n",(char *)q-(char *)p);//32  字符型sizeof是1
 printf("%d\n",(char ***)q-(char ***)p);//8  去掉一个*,其是指针
 printf("%d\n",(double *)q-(double *)p);//4  去掉一个*,其类型double(8个字节)
 printf("%d\n",(short *)q-(short *)p);//16        short(2个字节)
 printf("%d\n",(int)q-(int)p);//32 其是算数运算
 return 0;
}
*/

*/
/*
//指针的算术运算+,-
int main()
{
 int *p  = (int *)0x2010;
 printf("%x\n",p-2);//2008
 printf("%x\n",(char *)p-2);//200e    十六进制逢16-2=e(14)
 printf("%x\n",(short **)p-2);//2008
 printf("%x\n",(long *)p-2);//2008
 printf("%x\n",(double *)p-2);//2000
 printf("%x\n",(long long)p-2);//200e
 return 0;
}

*/
/*

int main()
{
 int *p = (int *)100;   p=100
 printf("%d\n",p+2);//108=100+2*4 整型地址4个字节
 printf("%d\n",(char **)p+2);//108  指针
 printf("%d\n",(short *)p+2);//104  2个字节
 printf("%d\n",(long long *)p+2);//116  8个字节
 printf("%d\n",(float *)p+2);//108
 printf("%d\n",(double *)p+2);//116    8个字节
 printf("%d\n",(unsigned long)p+2);//102  算术运算
 return 0;
}
*/
/*
//指针加法需要调整,调整的权重为指针本身去掉一个*号,然后求sizeof
//如,指针p+-n,实际加的地址为p+-n*(sizeof(*p))
int main()
{
 int arr[10] = {1,2,3,4,5,6};
 int *p = arr;
 *p = 10;
 p++;//加一个单元格                                 p++ 1.加一个字节(不合理)计算太复杂
                                                                         2.加一个单元格
                                                                     //    3.加整个数组(不合理)只是起点与终点起作用        
  
  
  

 //p = (int *)((int )p + 1);
 *p = 20;
 printf("%d,%x,%d\n",arr[0],arr[0],arr[1]);
 return 0;
}
*/

//字符串复制
void Mystrcpy1(char *des,char *src)//1
{
 int i;
 for(i=0;src[i]!='\0';i++)//1
 {
  des[i] = src[i];//*(des+i) = *(src+i);
 }
 des[i] = '\0';
}
void Mystrcpy2(char *des,char *src)
{
 while(*src != '\0')//2
 {
  *des = *src;
  src++;
  des++;
 }
 *des = '\0';
}
void Mystrcpy3(char *des,char *src)
{
 int i;
 for(i=0;*(src+i)!='\0';i++)        //*(aar+i)== arr[i]
 {                                            //p=arr
                                               // p[i]==*(p+i)
  *(des+i) = *(src+i);
 }
 *(des+i) = '\0';
}
void Mystrcpy(char *des,char *src)
{
 while(*des++ = *src++) ;//此涵义利用‘\0’=0,0假非零真
}
//字符函数
int main()
{
 char str1[] = "abcde";
 char str2[6] = "xyz";
 char str3[100] = "haha";
 //str2 =  str1;//error,数组不能整体赋值
 Mystrcpy(str2,str1);
 printf("%s\n",str2);
 int a = 10;
 int b;
 int c;
 c = b = a;
 if(a = 100)
 {
  printf("a==100\n");
 }
 //有如下的需求
 //str2 = str1; //复制
 //str3 += str1;//将新串链接到原串的后面
 //str1 < str2 //比较大小
 return 0;
}
/*
//字符数组的初始化
int main()
{
 //int a;//局部变量没用初始化,值为随机值
 //printf("%d\n",a);
 char arr[10];//
 char brr[10] = {'a','b','c','d'};
 char crr[10] = {"abcd"};
 char drr[10] = "abcd";//字符串:一定包含'\0'。  也只有包含'\0'才能成为字符串
 //char err[4] = "abcd";//error
 char frr[4] = {'a','b','c','d'};//不是字符串,因为没用'\0'
 char hrr[5] = {'a','b','c','d'};//是字符串
 printf("%s\n%s\n",frr,hrr);

 printf("%d,%d,%d\n",0,NULL,'\0');
 //char *cp = (char *)malloc(10);
 //float brr[10];
 //short crr[10];
 return 0;
}
*/
/*
//指针
void Fun(int **pp)
{
 *pp = NULL;
}
int main()
{
 int a  = 10;
 int *p = &a;
 //p = NULL;//NULL 是无效指针
 Fun(&p);//目的:同上 p=NULL;一样的效果。todo 问题:1,为什么不可以;2、如果想要一样该怎么改
                                                                                             p=NULL没有崩溃。其有解引用,没有传指针。在子函数形参需要二级指针 int **pp.*pp=NULL
 printf("%d,%d\n",p,*p);//0
 return 0;
}
*/
#if 0
void Swap_err1(int a,int b)//只修改形参值
{
 int tmp = a;
 a = b;
 b = tmp;
 //printf("%d,%d\n",a,b);
}
void Swap_err2(int *p1,int *p2)//传指针但没有解引用,只修改形参的值
{
 int *tmp = p1;
 p1 = p2;
 p2 = tmp;
}
void Swap_err3(int *p1,int *p2)//野指针
{
 int *tmp;//野指针,悬挂指针,没有访问权限
 *tmp = *p1;//崩溃
 *p1 = *p2;
 *p2 = *tmp;
}
void Swap(int *p1,int *p2)//子函数的改变要想影响到父函数:1、传指针;2、解引用
{
 int tmp = *p1;
 *p1 = *p2;
 *p2 = tmp;
}
//todo 不使用临时变量交换a,b 的值
int main()
{
 int a = 10;
 int b = 20;
 printf("%d,%d\n",a,b);
 /*int tmp = a;
 a = b;
 b = tmp;*/
 //Swap(a,b);
 Swap(&a,&b);
 printf("%d,%d\n",a,b);
 return 0;
}
#endif
/*
int main()
{
 int a = 10;
 int b = 20;
 int *p = &a;
 //printf("%d\n",sizeof(p));
 *p = 100;//间接访问符,解引用  a = 100;
 p = &b;
 *p = 200;//b = 200;
 int **pp = &p;
 *pp = &a;
 **pp = 1000;
 *pp = &b;
 **pp = 2000;
 return 0;
}
*/
/*
//void Show(int arr[10],int len)//int *arr,
void Show(int *arr,int len)
{
 //for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)//error
 for(int i=0;i<len;i++)
 {
  printf("%d ",arr[i]);
 }
}
int main()
{
 int arr[10] = {};//初始化部分内容,剩余为0
 //for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
 //{
 // printf("%d ",arr[i]);
 //}
 Show(arr,sizeof(arr)/sizeof(arr[0]));
 return 0;
}
*/
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值