一、取地址运算

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)特点

  1. 数组变量是特殊指针

  2. 数组变量本身表达内存地址

#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语言指针(就做个笔记)相关推荐

  1. gdb调试C语言 指针与内存——学习笔记

    文章目录 多文件操作 Linux中C语言程序编写的小操作 Makefile编写 main函数详解 标准输入输出流,错误流 文件内容输入和输出 使用gdb调试 启动gdb 查看 运行程序 设置断点 单步 ...

  2. AutoLeaders控制组——C语言指针和字符串学习笔记

    指针和字符串目录 1.指针概述 1.1内存 1.2物理存储器和存储地址空间 2指针基础知识 2.1指针变量的定义和使用 2.2通过指针间接修改变量的值 2.3指针大小 2.4野指针和空指针 2.5万能 ...

  3. linux c 指针和内存分配内存,Linux C语言指针与内存学习笔记

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 环境准备 Ubuntu 操作系统.VIM 编辑器.GCC 编译器.GDB调试器. 初始指针 通过两个数的交换引入指针指针 ...

  4. C语言 函数(做个笔记)

    1,函数的基本情况 类型 函数名(形参)             //函数首部 { 函数体...... } 2,函数的定义 <类型>函数名(形参) (1) 形参之间用逗号分割,每个形参前面 ...

  5. C语言 数组(做个笔记)

    1,定义数组 (1)普通定义 <类型>变量名称[元素数量] int grade[100] double a[20] (1)元素数量 (2)集成初始化定义 a={1,2,3,4,5,8,9, ...

  6. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  7. 对C语言 结构指针变量做函数的参数 结构作为函数的参数

    一.结构指针变量做函数的参数 /* 用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销. */ /* 计算一组学生的平均成绩和不及格的人数,用结构指针变量作函数参数 ...

  8. go学习笔记-语言指针

    语言指针 定义及使用 变量是一种使用方便的占位符,用于引用计算机内存地址.取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址. 一个指针变量指向了一个值的内存地址.类似于变量和常量, ...

  9. c语言指针的笔记,C语言指针笔记

    C语言指针是难点,是必须要攻克的堡垒. 看C语言的资料,指针是绕不过去的,这里记录自己对指针的理解. 一.感性认识指针. 0.有如下C代码,存为point.c文件 #include int main( ...

  10. 最热网友收藏:深入理解C语言指针的奥秘((2007年第3周)

    2007年第3周最热网友收藏 深入理解C语言指针的奥秘(93),共121人收藏,yanglilibaobao首先收藏 我来做个好人吧,40种网站设计常用技巧(78),共440人收藏,wuzeng200 ...

最新文章

  1. 03flex弹性布局父项常见属性总结
  2. log4j(四)——如何控制不同风格的日志信息的输出?
  3. 性能监控工具 NewRelic 简介
  4. yii框架下使用redis
  5. Spring Security(18)——Jsp标签
  6. jQuery 1.4官方文档中文版
  7. 微博抽奖贴为什么到时间了不开奖_热搜第一!微博闹剧,锦鲤“信小呆”被这样处罚...
  8. 2019级C语言大作业 - 冷冻双侠
  9. python处理二进制文件_使用Python进行二进制文件读写的简单方法(推荐)
  10. vivoz3android版本多少,谁更值得买—荣耀V10 OR vivo Z3
  11. IAR_STM32_BootLoader
  12. 2022.7台式机装机指南(3060 + 12490F)
  13. c语言调用串口扫码枪,C#利用控件mscomm32.ocx读取串口datalogic扫描枪数据
  14. codeblocks下载安装与解决codeblocks找不到编译器的方法
  15. 程序员是怎么分享微信二维码的
  16. 打开caj文件显示服务器忙,欢迎使用CAJViewer-常见问题
  17. springboot springsecurity接入cas单点登录,前后端分离
  18. 无线安全-WiFi渗透流程
  19. jsp 页面进行debug 断点找错误
  20. linux中ln -s 命令详解

热门文章

  1. LeetCode简单题之字符串中的最大奇数
  2. 如何写新的C++ OP
  3. NSight Compute 用户手册(中)
  4. 什么是智能医院?如何构建自己的解决方案?
  5. The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS
  6. DocumentsContract cannot be resolved
  7. JSOI2010 BZOJ1826 缓存交换
  8. 深入浅出的webpack构建工具---DllPlugin DllReferencePlugin提高构建速度(七)
  9. C# window服务操作
  10. 验证环境中的program为什么必须是automatic