首页 > 其他分享 >奋斗百天我要xueC--04

奋斗百天我要xueC--04

时间:2023-03-01 21:35:55浏览次数:43  
标签:p1 04 -- char xueC int 内存 数组 指针

0x00 指针

内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

0x01

#include <stdio.h>
int main(){
    int a = 100;
    char str[20] = "c.biancheng.net";
    printf("%#X, %#X\n", &a, str);
    return 0;
}

1、CPU 访问内存时需要的是地址,而不是变量名和函数名
2、变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。
3、变量名表示本身。数组名、字符串名、函数名表示内存数据块的首地址

0x02 定义指针

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

0x03 指针的加减和比较运算

指针的加减与数据类型有关

int a = 1 ,*p=&a;
假设 &a = 0x1B04
p+1 = 0x1B08  增长多少取决于int占多少字节
char b = '1',*pb = &b;
&b = 0x1B00
pb + 1 = 0x1B01

0x04

数组长度 sizeof(arr)/sizeof(int)
*(arr+i) == arr[i]
指针数组 int *p = arr

0x05 字符数组与字符串常量

在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。(,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区)

char *p1 = "i wanna to learn C"
char str[] = "i wnanno to learn Java"
char *p2 = str

0x05 指针作为参数

参数传递的本质,内存的拷贝,指将一块内存上的数据拷贝到另一块内存上。对于简单的数据类型char、float、int 等占用的字节数不会太多,拷贝数据块,不太会影响效率。对于数组等数据集合,它的长度、大小是不可控的。太大的话,拷贝极其影响效率。所以不可做参数进行传递。
int max(int *intArr,int len)
int max(int intArr[],int len){}

0x06 指针作为函数返回值

指针函数
char *p1(char *str1,char *str2)
return &n
函数结束,会销毁其内变量,(其实是弃之不用,如果没有其它因素影响,能够及时使用,也能够的到正确的数据,如果有其它函数被调用,就会将该块内存覆盖。)

0x07 二级指针

指向指针的指针
int a = 9
int *p1 = &a
int **p2 = &p1

0x08 指针数组

int *arr[] = {&a,&b,&c}
int **p1 = arr
指针数组与字符串数组结合

char *str[] = {"caa","fef","df"}
str[0] str[1]

二维数组指针

int a[3][4]={0}
int(*p)[4]= a
p是一个指针,指向一个数组 数组的类型int[4] -> a所包含的每一个一维数组的类型
使用加减法时,p+1 前进4*4=16个字节

*(*(p+i)+j)每个元素的值

指针数组与二维数组指针区别

int *p1[5]
int (*p2)[5]

指针数组是一个数组,他的元素存放的的指针
二维数组指针是一个指针,指向二维数组
p1 占用20个字节的内存
p2 占用4个字节的内存


函数指针

int max(int x,int y){
	printf("%d%d",x,y)
}
int (*p1)(int ,int) = max
(*p1)(3,4)


什么时候用什么样类型的指针,刚学,还是晕晕的,咋用啊。

标签:p1,04,--,char,xueC,int,内存,数组,指针
From: https://www.cnblogs.com/cmview/p/17125221.html

相关文章

  • java HashMap 源码
    jdk1.7和1.8区别比较大,主要是数据结构上的区别从而put()get()等方法也会有相应变化jdk1.7数据结构为数组(buckets)+单向链表(entries)hash冲突时......
  • 自关联、子查询
    一、(知道)自关联介绍1、自关联的应用场景省市区的信息,一般不会分开放在不同的表里面进行存储,而是放在同一个表中。一张表当作多张表来使用。2......
  • javaSE学习四
    Super/*super注意点:1.super调用父类的构造方法,必须在构造方法的第一一个2.super必须只能出现在子类的方法或者构造方法中!3.super和this不能同时调用构......
  • 前台主页功能,前台轮播图功能完成,git介绍和安装
    前台主页功能,前台轮播图功能完成,git介绍和安装前台主页功能#首页页面组件#头部组件(小组件)#轮播图组件(小组件)#尾部组件(小组件)1Header组件<template>......
  • 设计模式-动态代理
      一:jdk动态代理  二:cglib代理2.1:引入cglib依赖<!--https://mvnrepository.com/artifact/cglib/cglib--><dependency><groupId>cglib</groupId>......
  • jdk下载、Linux环境安装jdk
    访问网站:oracle.com点击:Resources-->JavaDownloads相当于访问:https://www.oracle.com/java/technologies/downloads/找到jdk1.8,下载对应版本,比如linuxt位32位,则下载:jd......
  • 媒体img组件以及swiper轮播
    .swiper{    height:400rpx;    margin-top:100rpx;    .item{      padding:20rpx;      width:100%;   ......
  • I/O
    I/O可以将数据输入到计算机,或者可以接收计算机输出的外部设备,属于计算机中的硬件部件按使用特性分类:人机交互类外部设备:数据传输速度慢,如鼠标、键盘、打印机存储......
  • Windows10环境中让小猪Snort跑起来
    一、背景   Snort是一款著名的开源入侵检测系统,有着悠久的历史和众多用户。我们通过部署Snort系统来监测异常网络活动并发出报警。Snort的跨平台性能很好,它支持的各种L......
  • webpack配置完全指南
    前言对于入门选手来讲,webpack配置项很多很重,如何快速配置一个可用于线上环境的webpack就是一件值得思考的事情。其实熟悉webpack之后会发现很简单,基础的配置可以分为......