首页 > 其他分享 >C语言(一级指针)

C语言(一级指针)

时间:2024-03-21 15:29:05浏览次数:28  
标签:const 一级 int C语言 char 地址 printf 指针

指针

本质:

地址

一级指针

一级指针变量名:存储普通变量的地址

格式:

存储类型         数据类型         *指针变量名

                                int                 *p

int a=5;

int *p=&a;

--------------------------------------------------

char b='q';

char *p1=&b;

访问:

int a=5;

int *p=&a;

printf("%d %d\n",a,*p);

printf("%p %p\n",p,&a);

指针操作符

*:取地址里边的内容

&:取地址符:取变量的地址

int a=5; int *p=&a;

*&(变量)a==(变量)a; *&(地址)p==(地址)p; (*&一起出现会抵消,从右向左)

&*a:错误 &*(地址)p==(地址)p;

初始化

指针在使用前要先定义,同时初始化,未初始化的指针变量不能随便使用,会产生野指针

1)int a=5;

int *p=&a; //定义指针的同时,直接初始化

2)int *p=NULL; //先定义一个空指针,后边可以重新赋值

指针p指向变量a,*p可以访问到a的值,

可以通过*p间接修改变量a的值

把数组的首地址赋值给指针变量

int a[5]={2,3,4,5,6};

int *p=a;

--------------------------------------------------------

// int a[5]={2,3,4,5,6};

// int *p=a; === *p==2

char c[]="hello";

char *p=c; === *p=='h'

printf("%c\n",*p);

一维数组:数组名也是数组的首地址,是地址常量,不能为左值(=左边),不能被重新赋值。

指针运算

算术运算

int a[5]={2,13,4,5,6};

// char a[]="hello";

int *p=a;

printf("%p\n",p);

printf("%d\n",*p);

p++;//p=p+1 //指针向高地址方向移动一个数据单位(int 4字节;char 1字节),指针的指向发生改变

printf("%p\n",p);

printf("%d\n",*p);

int a[5]={2,13,4,5,6};

// char a[]="hello";

int *p=a;

printf("%p\n",p);

printf("%p\n",p+2); //指针访问高地址方向第n个元素,指针的指向不发生改变

printf("%p\n",p);

p++ //指针向高地址方向移动一个数据单位(int 4字节;char 1字节),指针的指向发生改变

p+2 //指针访问高地址方向第n个元素,指针的指向不发生改变

验证:同一个数组,两个地址之间的差值=相差元素个数

int a[5]={2,13,4,5,6};

int *p=&a[2];

int *q=a;

printf("%d\n",p-q);

………………………………………………………………

printf("%p\n",5); //0x5 %p打印是十六进制格式,会把数字5转成十六进制格式

int m = 100;

double n = 200;

int *p=NULL;

double *q=NULL;

p= &m;

q = &n;

printf(“m=%d &m=%p\n”, m, &m);

printf(“p=%p p+2=%p\n”, p, p+2);

printf(“n=%lf &n=%p\n”, n, &n);

printf(“q=%p q+2=%p\n”, q, q+2);

关系运算

< > ==

同一个数组下比较,才有意义

高地址>低地址

指针的大小

int a=3;

int *p1=&a;

printf("%d\n",sizeof(p1));

char b='q';

char *p2=&b;

printf("%d\n",sizeof(p2));

getconf LONG_BIT 查看操作系统位数

32位操作系统 ,指针大小为4字节 1字节==8位

8位16进制 4*8=32位二进制 =4字节

64位操作系统 ,指针大小为8字节

字符串倒序输出,用指针hello--->olleh

#include<stdio.h>

#include<string.h>

int main(int argc, char const *argv[])

{

char a[]="hello",temp;

char *p=a;

char *q=p+strlen(a)-1;

while(p<q)

{

temp=*p;

*p=*q;

*q=temp;

p++;

q--;

}

puts(a);

return 0;

}

循环输入一个五位数,判断是否是回文数,当输入0时结束。12321

char *p=a;

char *q=p+strlen(a)-1;

int test=1;

while(p<q)

{

if(*p!=*q)

test=0;

p++;

q--;

}

if(test==1)

printf("yes\n");

else

printf("no");

指针修饰

const void

const 常量化 read-only(只读)

修饰普通变量,不能直接通过变量名进行修改

const int a=5; //int const a=5;

a+=6; //error

通过指针修改

const int a=5;

int *p=&a;

*p=88;

printf("%d %d\n",a,*p);

修饰指针

int const *p; (const int *p)//const修饰*p指针指向的内容不能修改;但是指针的指向可以修改

int a=5;

const int *p=&a;

1)*p=33; //error

2)int b=33;

p=&b; //正确

修饰p

int * const p=&a; //const修饰p指针的指向不能改,指针指向的内容可以改

int a=5;

int * const p=&a;

// p=&b;

*p=33;

printf("%d %d\n",a,*p);

既修饰指针也修饰p

const int * const p; //const修饰p指针的指向和指针指向的内容都不能改

指针修饰

void 不能修饰普通变量,修饰指针表示任意类型的指针.

void a;//错误

void *p;//任意类型的指针

一般在函数参数或函数返回值中用到

void *p;//任意类型的指针

强转成int类型指针(int *)p

取内容*(int *)p

void *p=NULL;

int a=5;

p=&a;

printf("%p %p\n",(int *)p,&a); //强转只在当前一行有效

printf("%d %d\n",*(int *)p,a);

void *p=NULL;

---------------------------------------------------

int a=5;

int *q=(int *)p;

q=&a;

printf("%p %p\n",q,&a);

printf("%d %d\n",*q,a);

大小端

大端:低地址里边存放高字节数据,高地址里边存放低字节数据

小端:低地址里边存放低字节数据,高地址里边存放高字节数据

0x12345678

大端:0x12 0x34 0x56 0x78

小端:0x78 0x56 0x34 0x12

int a=0x12345678;

char b;

b=(char)a;

printf("%#x\n",b);//0x78

电脑:小端存储

标签:const,一级,int,C语言,char,地址,printf,指针
From: https://blog.csdn.net/qq_64951781/article/details/136885511

相关文章

  • C语言 - 字符串截取
    1、字符串截取#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){charstr[80]="1001#8888#你好";constchars[2]="#";char*token;char*Array[10];/*获取第一个子字符串*/token=......
  • C语言字符串
    字符串由双引号引起来的一串字符称为字符串,例如“abcdef”,字符串的结束标志是\0,在计算字符串长度时\0是结束标志,不算做字符串内容。字符与字符串的程序监控intmain(){    chararr1[]="abcdef";    chararr2[]={'a','b','c','d','e','f'};    ......
  • 【C语言】求1-1/2+1/3-1/4+......-1/100
    用for循环,第二个数就为负数第三个负负为正依次推类。intmain(){ intsign=1; doublesum=0.0; intdeno=1; for(intdeno=1;deno<=100;deno++){ doubleterm=sign*(1.0/deno); sum+=term; sign=-sign; } printf("结果为:%f\n",sum)......
  • 判断是否为闰年?【C语言】
    感觉就for有些别扭。对了也可以用其他方法l#includ<stdio.h>intmain(){intyear=0;printf("请输入年份:%d\n",year);scanf("%d\n",&year);for(;(year%4==0&&year%100!=0)||year%400==0;){printf("%d:是闰年\n",year);}......
  • C语言之打鱼晒网问题
    目录一简介二代码实现步骤一:判断输入日期步骤二:计算总天数步骤三:判断行为模式三时空复杂度一简介打鱼晒网问题是一个经典的编程题目,源自中国的俗语“三天打鱼两天晒网”,意思是周期性地工作和休息。在C语言中实现这一问题的程序设计目标是:当给定一个日期后,计算......
  • C语言之求任意次方的最后三位
    目录一简介二代码实现三时空复杂度一简介在C语言中,求一个整数任意次方的最后三位数可以使用快速幂算法结合取模运算来实现。二代码实现#include<stdio.h>//使用快速幂算法计算x的y次方对1000取模的结果intlastThreeDigits(intx,inty){int......
  • C语言之计算某日是该年的第几天
    目录一简介二代码实现三时空复杂度一简介 在C语言中,计算某日是该年的第几天通常涉及以下步骤:判断输入的年份是否为闰年。根据判断结果,确定当年二月的天数(28或29天)。然后,根据月份从前几个月开始累计天数。二代码实现以下是一个简单的C语言函数示例,它接收一......
  • c语言运用,猜数字小游戏设计
    我们要用c语言做一个猜数字小游戏,就是在1-100的数字中随机生成一个数字,然后我们去猜测那个生成的数字。做这个游戏,那我们需要的是一个整体的思想,做一个游戏需要有哪些部分?一开始可能会没有头绪,但是只要顺着一条线的思维,想一想要做的游戏刚开始是什么样子,玩的时候是什么样子,游......
  • c语言(自定义类型——结构体)
    C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增......
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二
     目录 ​编辑1.二叉树的顺序结构及实现1.1二叉树的顺序结构2堆的概念及结构3堆的实现3.1堆的代码定义3.2堆插入数据3.3打印堆数据3.4堆的数据的删除3.5获取根部数据3.6判断堆是否为空3.7堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序4.2升......