C语言指针(就做个笔记)
一、取地址运算
1.sizeof()函数
用于求 变量或数据类型所占字节数
#include <stdio.h>
int main(){int num_1,num_2,a;a=2;num_1=sizeof(int);num_2=sizeof(a);printf("int所占字节数为%d\n",num_1);printf("整型a所占字节数为%d",num_2);return 0;
}输出:
int所占字节数为4
整型a所占字节数为4
2.&运算符
获得变量地址,操作数必须是变量
&(i++);
&(i+P); ///这些都是不对的,必须有明确的变量
(1)变量内存地址
#include <stdio.h>
int main(){int i=0;int a=1;printf("i的内存地址为%p\n",&i);printf("a的内存地址为%p",&a);return 0;
}输出:
i的内存地址为000000000062FE1C
a的内存地址为000000000062FE18
%p 是输出16进制
不难发现i,a变量,相差4个内存地址。
联系int所占字节数为4,所以,内存地址的分配,按栈,自顶向下分配。
(2)数组内存地址
#include <stdio.h>
int main(){int a[10];printf("a的内存地址为%p\n",&a);printf("数组名 %p\n",a);printf("a[0] 的内存地址为%p\n",&a[0]);printf("a[1] 的内存地址为%p\n",&a[1]);return 0;
}输出:
a的内存地址为000000000062FDF0
数组名 000000000062FDF0
a[0] 的内存地址为000000000062FDF0
a[1] 的内存地址为000000000062FDF4
数组名所表示该数组所分配连续内存空间中第一个单元的地址,即首地址。
内存地址:a[0]==a==&a
二、指针
1.指针定义
指针用来保存地址变量。
p指向i-->p就是变量i的地址
int* p=&i;
int* p,q; //q是整型,p是指针 无论*在哪边都一样,没有 int* 这个类型
int *p,q; //q是整型,p是指针
int *p,*q; //p,q都是指针
2,指针做参数
#include <stdio.h>
void f(int* p); //调用传来的指针参数
int main(){int i=0;f(&i); //把变量i的地址传给函数return 0;
}void f(int* p){printf("%p",p);
}
3,*单目运算符
用来访问指针所表示地址上的变量
p是i的地址
*p是变量i
(1)访问i,返回对应值
#include <stdio.h>
int main(){void f(int* p);int i=0;f(&i);return 0;
}void f(int* p){printf("%d\n",*p);
}输出:0
(2)访问i,更改i值
#include <stdio.h>
int main(){void f(int* p);int i=0;f(&i);printf("i=%d",i);return 0;
}void f(int* p){*p=1000;
}输出:i=1000
函数独立空间变量规则,无法限制指针。
*p=1000 ------> i=1000; 更改i的值
在此可以想到scanf()函数,也是同样的原理。
三、指针与数组的联系
注:64位系统下,指针大小为8字节
32位系统下,指针大小为4字节
1.数组做函数的参数,不能使用sizeof()函数
#include <stdio.h>void f(int a[]);
int main(){int num[]={1,2,3,4};f(num);printf("num %d\n",sizeof(num));return 0;
}void f(int a[]){printf("a %d\n",sizeof(a));
}输出:
a 8
num 16
发现函数中,数组大小和指针一样大
//a[0]字节大小之所以是4,是因为a[0]是一个元素,是整型数。整型字节大小为4.
//因为sizeof(a)字节大小为sizeof(int*)==8.所以sizeof(a)/sizeof(a[0])==2.
#include <stdio.h>void f(int a[]);
int main(){int num[]={1,2,3,4};f(num);printf("num[0] = %d",num[0]);return 0;
}void f(int a[]){a[0]=1000;
}输出:num[0] = 1000
数组num[0]中的值改变了,由此我们可以得出
函数参数表中,数组其实是指针
sizeof(a)==sizeof(int*)
数组参数虽然是指针,但仍可以进行数组运算
2.数组变量特点
(1)特点
数组变量是特殊指针
数组变量本身表达内存地址
#include <stdio.h>
int main(){int num[]={1,2,3,4};int* p=num;//无需使用&取内存地址printf("p = %p\n",p); printf("num = %p",&num[0]);//数组元素单个单元是变量,需要使用&return 0;
}输出:
p = 000000000062FE00
num = 000000000062FE00
a==&a
(2)[ ]操作数
可以对数组/指针使用
#include <stdio.h>
int main(){int number=0;int* p=&number; //p是number内存地址printf("%d\n",*p);printf("%d",p[0]); //p[0]指的是实际值的第一个整数return 0;
}输出:
0
0
(3)* 操作符
可以对数组/指针使用
数组变量是const指针,不能改变
int b[ ]--->int* const b; 常量指针
所以b=a(X) 数组间不能整个赋值
int* p=a (正确) //a是数组变量
C语言指针(就做个笔记)相关推荐
- gdb调试C语言 指针与内存——学习笔记
文章目录 多文件操作 Linux中C语言程序编写的小操作 Makefile编写 main函数详解 标准输入输出流,错误流 文件内容输入和输出 使用gdb调试 启动gdb 查看 运行程序 设置断点 单步 ...
- AutoLeaders控制组——C语言指针和字符串学习笔记
指针和字符串目录 1.指针概述 1.1内存 1.2物理存储器和存储地址空间 2指针基础知识 2.1指针变量的定义和使用 2.2通过指针间接修改变量的值 2.3指针大小 2.4野指针和空指针 2.5万能 ...
- linux c 指针和内存分配内存,Linux C语言指针与内存学习笔记
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 环境准备 Ubuntu 操作系统.VIM 编辑器.GCC 编译器.GDB调试器. 初始指针 通过两个数的交换引入指针指针 ...
- C语言 函数(做个笔记)
1,函数的基本情况 类型 函数名(形参) //函数首部 { 函数体...... } 2,函数的定义 <类型>函数名(形参) (1) 形参之间用逗号分割,每个形参前面 ...
- C语言 数组(做个笔记)
1,定义数组 (1)普通定义 <类型>变量名称[元素数量] int grade[100] double a[20] (1)元素数量 (2)集成初始化定义 a={1,2,3,4,5,8,9, ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- 对C语言 结构指针变量做函数的参数 结构作为函数的参数
一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...
- go学习笔记-语言指针
语言指针 定义及使用 变量是一种使用方便的占位符,用于引用计算机内存地址.取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 一个指针变量指向了一个值的内存地址.类似于变量和常量, ...
- c语言指针的笔记,C语言指针笔记
C语言指针是难点,是必须要攻克的堡垒. 看C语言的资料,指针是绕不过去的,这里记录自己对指针的理解. 一.感性认识指针. 0.有如下C代码,存为point.c文件 #include int main( ...
- 最热网友收藏:深入理解C语言指针的奥秘((2007年第3周)
2007年第3周最热网友收藏 深入理解C语言指针的奥秘(93),共121人收藏,yanglilibaobao首先收藏 我来做个好人吧,40种网站设计常用技巧(78),共440人收藏,wuzeng200 ...
最新文章
- 03flex弹性布局父项常见属性总结
- log4j(四)——如何控制不同风格的日志信息的输出?
- 性能监控工具 NewRelic 简介
- yii框架下使用redis
- Spring Security(18)——Jsp标签
- jQuery 1.4官方文档中文版
- 微博抽奖贴为什么到时间了不开奖_热搜第一!微博闹剧,锦鲤“信小呆”被这样处罚...
- 2019级C语言大作业 - 冷冻双侠
- python处理二进制文件_使用Python进行二进制文件读写的简单方法(推荐)
- vivoz3android版本多少,谁更值得买—荣耀V10 OR vivo Z3
- IAR_STM32_BootLoader
- 2022.7台式机装机指南(3060 + 12490F)
- c语言调用串口扫码枪,C#利用控件mscomm32.ocx读取串口datalogic扫描枪数据
- codeblocks下载安装与解决codeblocks找不到编译器的方法
- 程序员是怎么分享微信二维码的
- 打开caj文件显示服务器忙,欢迎使用CAJViewer-常见问题
- springboot springsecurity接入cas单点登录,前后端分离
- 无线安全-WiFi渗透流程
- jsp 页面进行debug 断点找错误
- linux中ln -s 命令详解
热门文章
- LeetCode简单题之字符串中的最大奇数
- 如何写新的C++ OP
- NSight Compute 用户手册(中)
- 什么是智能医院?如何构建自己的解决方案?
- The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS
- DocumentsContract cannot be resolved
- JSOI2010 BZOJ1826 缓存交换
- 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)
- C# window服务操作
- 验证环境中的program为什么必须是automatic