首页 > 其他分享 >C语言-指针

C语言-指针

时间:2023-09-03 16:01:58浏览次数:37  
标签:变量 int C语言 char 地址 printf 指针

目录

指针

  • 前置概述:在计算机内存中最小的操作单元是字节Byte(不是位bit)。每一个字节单元,都有一个编号,称为地址。

  • 指针定义:专门用来存放地址的变量,称为指针变量,通称指针

  • 格式:<存储类型> <数据类型> *<指针变量名>

    int a = 10;
    int * p;
    p = &a;
    // 可以理解为:p指针的目标数据类型是int,p指针自身的数据类型是int *
    // p:指针变量,存的内容是目标的地址
    // *p:是指针的目标的数据
    // &p:指针变量自身所占用存储区的地址,是一个常量
    
    
    // 延申出多级指针
    int * * q;
    q = &p;
    // q:指向目标p的地址
    // q的目标是p,p的数据类型是int *,那么定义q指针就是 int * * q
    
  • 指针的移动

    int a = 10, *p;
    double b = 3, *q;
    
    printf("%p,%p\n",p,p+2); // 移动8个字节
    printf("%p,%p\n",q,q+2); // 移动16个字节
    
  • 使用指针访问数组

    int a[] = {1,2,3,4,5};
    int * p;
    p = a;
    printf("%d,%d,%d,%d\n",a[1],*(p+1),*(a+1),p[1]); //a[1],*(p+1),*(a+1),p[1]具有完全相同的功能
    
    p++; // p是指针变量,可以做运算
    // a++; // error,a是数组名(地址常量),不能做运算
    
  • 延申:指针变量所占用的内存空间是对少?
    根据操作系统来定的,比如操作系统是32bit,32bit/8bit = 4 Byte,那么地址就是用4Byte来表示的,指针占用内存就是4Byte。

  • 字符数组及字符串

    • C语言本身没有内置的字符串类型,字符串本质上是一种特殊类型的数组,它的组成元素类型为char,除此之外不受制与数组长度的限制,以'\0'作为结束标志,作为字符串结束的标志。(\0作为一个特殊字符,它的ASCII值为0,但是它不是'0'字符,'0'字符的ASCII值为48。)
    • 定义字符串如下:
      // 以下两种方式等同
      char a[] = {'h','e','l','l','o','\0'};
      char b[] = "hello";
      printf("%s,%s",a,b);
      
      // 字符串数组,其实就是多维的字符数组
      char c[][3] = {"apple","peach","orange"};
      
    • 字符串常量注意点:当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值。
      char *p = "hello";
      *p = 'H'; // 报错,字符串常量不能修改
      
      char *p1 = "world";
      char *p2 = "world";
      printf("%p\n",p1); //0x8048500
      printf("%p\n",p2); //0x8048500  地址相同
      
      // 延申:c中全局变量,static修饰的变量,字符串常量,这三种是放在静态区域的,而不是堆栈内存中,程序结束的时候才释放这些内存。
      

行指针

行地址:二维数组名代表数组的起始地址,数组名+1,是移动一行元素。因此,二维数组名常被称为行地址。
行指针(数组指针):存储行地址的指针变量,称为行指针变量。

int a[][3] = {{5,4,7},{3,7,9},{2,5,6}};
int *p;
int (*q)[3];//行指针

p = a; // waring,不兼容的指针类型
q = a;

// 访问值为9的元素?
printf("%d\n",*(p+5));
printf("%d\n",*(*(q+1)+2)); // 使用行指针访问

多级指针

void指针

  • void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量。
  • 对于void指针,在没有强制类型转换之前不能进行任何指针的算术运算。
    int main(int argc, char *argv[])
    {
    	int a = 10;
    	double b = 3.14;
    
    	void * p, *q;
    	p = (void *)&a;
    	q = (void *)&b;
    
    	//printf("%d,%lf\n",*p,*q);
    	int * r = (int *)p;
    	printf("%d,%lf\n",*r,*(double *)q);
    	return 0;
    }
    

const修饰符

常数化变量的值

  • const int a = 10; a的值不能修改

  • const int * p; p指向的目标值不能修改

  • int const * p = &m; p的地址不能修改,但是可以修改目标的值

    int main(int argc, char *argv[])
    {
    	int m = 10;
    
    	const int * p;
    	p = &m;
    	//*p = 20; // error
    	printf("%d\n",*p);
    	
    	int * const q = &m;
    	//q = &m;  // error
    	*q = 20;
    	printf("%d\n",*q);
    
    	return 0;
    }
    

标签:变量,int,C语言,char,地址,printf,指针
From: https://www.cnblogs.com/Wang-py/p/17675073.html

相关文章

  • C语言-函数
    函数基本用法举例:两数求和#include<stdio.h>intsum(int,int);//函数的声明,函数的原型intmain(intargc,charconst*argv[]){ intm=10; intn=20; ints; s=sum(m,n); printf("%d\n",s);}intsum(inta,intb){ intsum; sum=a+b; returns......
  • C语言自增++放前面还是后面?
    《STL标准程序》里边一直提到前置比后置效率更高。关于此的一点个人理解记录下来。a++:加的过程中要先产生一个临时变量temp,加1之后的值赋给temp,然后你可以使用a(在if、for、while..中),最后再把temp的值assign给a。++a:这个就是直接在a上加1了,然后改怎么用,就怎么用。归根结底:二者的......
  • 计算机萌新的成长历程——初识C语言16
    大家好,很高兴又能跟各位朋友见面了,前面我们花了两篇内容来探讨操作符的相关内容,今天咱们要开始探讨新的内容了——常见关键字。对于常见关键字,我是这样理解的——C语言中自带的可以直接使用的字符,比如咱们的数据类型:int、char、short、long、longlong、float、double……又比如咱......
  • 汉诺塔问题C语言递归
    (汉诺塔问题C语言递归)什么是汉诺塔问题汉诺塔问题是一个经典的问题。汉诺塔(HanoiTower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另......
  • 通过c语言来实现斐波那契数列
    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列,像这样的:0、1、1、2、3、5、8、13、21、34、55......这个数列从第3项开始,每一项都等于前两项之和。以下通过c语言来实现这个程序#include<stdio.h>//1123581321345589intmain(){ /......
  • 简单理解c语言指针
    &p(取地址)P*p(间接寻址) 假设p指向整数型变量a,那么可以理解为p等同于a的地址。*是间接寻址运算符,对p进行操作,找到p这个地址中所对应(放的)东西。也就是说,*p就是a。做个比喻,将*理解成取平方,而操作数p是地址,那么p的平方就是a,如2的平方就是4。(不过这里其实p不像是常量而更像变量x,......
  • C语言数组(9)--- 数组名(2)
    一.导入我们上篇文章讲了一维数组的数组名,接下来我们将介绍二维数组的数组名,我们先来猜一下以下代码执行的结果是多少:#include<stdio.h>intmain(void){ intarr[3][4]; intsz=sizeof(arr); printf("%d",sz); return0;}A.3B.4C.12D.48答案:D,解析:我们之前说过二维数组......
  • 《C和指针》学习笔记
    C和指针学习笔记前置条件1.1配置环境下载vscode安装编译器:这里以MinGw-w64为例。下载MinGw-w64的安装包并解压。添加到系统环境编辑tasks.json(该文件负责项目的编译,如果需要同时编译多个文件,需要对该文件进行如下注释内的修改):{"tasks":[{......
  • C语言读取csv文件并保存到二维数组
     #include<stdio.h>#include<string.h>#include<time.h>#defineMAXCHAR1024#defineMAXCOUNT1000000char*mat[MAXCOUNT][9];//如果放到main里面会有长度限制使应用程序退出,放在外面作为全局变量没有限制。intmain(){clock_tstart,end;start=clo......
  • 东方博宜OJ1009 数组逆序 C语言版
    题目描述给你 n 个整数,将其逆序输出。输入第一行一个整数 n (3≤n≤100)代表数的个数。第二行 n 个整数(空格隔开)(这些数在 0∼106 之间)。输出n 个整数(空格隔开)。样例输入3175输出571来源数组问题代码 #include<stdio.h>in......