c语言学习笔记 - 指针和数组
结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多。
#include <stdio.h>
int main(void){
int a = 180;
int b = 156;
int *c = &a; // int 指数据类型 * 指这是一个指针变量,存的是地址,&a是 a变量的地址, 把a的地址存在c这个指针变量类型里。
*c = 190 ; // 这里c里已经存上一个地址数据了,*c操作的是指向 c里的地址指向的数据也就是a内存空间里的数据
// 这样就像是间接操作一样,操作了a的数据
printf("%d",a); //输出a会变成190
return 0;
}
另外在函数传递参数的时候会看到诸如 void functionname(int arr[]) ;这里的arr[] ,[]里没有值指的是数组 arr第一个元素的地址,也就是 &arr[0] ,这就是为什么数组操作函数在函数里面操作了这个数组的话,外面调用的这个数组数据也已经变了,因为这里是传递一个指针,函数内和函数外这个参数是同一个内存空间上的数据。
再比如scanf("%d",&a); 这种函数传递参数时要用到参数地址,明白了上面的道理就知道为什么要加&号了。
但是还有一种情况 如果是scanf 字符串 ,例如 scanf("%s",str); 这里str 本身就是字符数组,传递进来就是指针,所以也是引用操作
再来看看数组和指针的一个简单例子
#include <stdio.h>
int main(void)
{
int a[3]={1,2,3};
int *p=&a[0]; //把a数组第一个元素的地址赋值给p指针
int i;
for(i=0;i<3;i++){
printf("a[%d] = %d \n",*(p+i)); //由于数组的内存地址是连续的,这时候P的地址依次递增,再加上*指针操作就会 依次操作a[0] ,a[1],a[2]
// *(p+0) -> a[0] *(p+1) -> a[1] *(p+2) -> a[2]
}
p=&a[1]; // 注意理解下 p=&a[1] 不能写成 *p=&a[1] ;
printf("a[0] is %d",*(p-1)); // *(p-1) 指 a[0]
printf("a[2] is %d",*(p+1)); // *(p+1) 指 a[2]
//注意以下区别
int *p=&a[0]; //相当于双重定义 整形的指针 p, 也可以写出 int *p; p=&a[0];
p=&a[1]; // 对
*p=&a[1]; // 错
*p=56; // 对
return 0;
}
c语言学习笔记 - 指针和数组的更多相关文章
- C语言学习笔记--指针和数组的关系
1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
- C语言学习笔记--指针阅读技巧
1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...
- C语言学习笔记--多维数组和多维指针
1. 指向指针的指针 (1)指针的本质是变量,会占用一定的内存空间 (2)可以定义指针的指针来保存指针变量的地址值 (3)指针是个变量,同样也存在传值调用与传址调用 重置动态空间的大小 #includ ...
- c语言学习笔记 - 指针和字符串
前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...
- c语言学习笔记.指针.
指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 数组
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 number0. ...
- C语言学习笔记之动态分配数组空间
本文为原创文章,转载请标明出处 高级语言写多了,再拿起C语言的时候,自己已经傻了... C语言中数组大小不能为变量,即使这个变量已经被赋过值了,应该使用malloc方法进行数组空间动态分配. 如下: ...
随机推荐
- mysql分区管理语句
1.key分区语句: ALTER TABLE order_info PARTITION BY KEY(orderSn) PARTITIONS 127; 2.rang分区语句: ALTER TABLE ...
- 如何提高阿里云cdn命中率?原命中率极低。
博客搬迁了,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/08/29/%E5%A6%82%E4%BD%95%E6%8F%90%E9%AB%98%E9 ...
- vue多文件上传进度条 进度不更新问题
转自 hhttp://www.cnblogs.com/muge10/p/6767493.html 感谢这位兄弟的文章,之前因为这个问题 ,我连续在sgmentflow上提问过多次,完全没人能回答.谢谢 ...
- EntityFrameworkCore 根据实体类自动创建数据库
1.首先新建 Asp.Net Core WebApi 项目 2.添加一下引用 : 2.1 Pomelo.EntityFrameworkCore.MySql(我用的Mysql 根据自己情况引用就行) ...
- C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值
用户控件主窗体结构:左侧树形菜单,右侧Panl: 根据点击的菜单节点,panl里面选择性加载某一个子窗体用户控件,并传值给子窗体: 反之,在子窗体进行相应的操作之后,传值给主窗体,触发主窗体的刷新. ...
- mysql连接超时的问题处理
1. 内网 ts 连接mysql 有时候会连接失败, 原因是 连接超时, 当时所有服务器一起启动,抢占资源,导致连接超过10s. 现在增加一次连接机会, 增加一些日志. 2. 并且对mysql 全局参 ...
- Allegro文档错误之:Iangle 命令
Allegro绘制弧线时,可以使用add rarc命令,或者菜单栏里 Add|Arc w/Radius. 使用该命令时,需要输入3个参数: 1,圆心坐标:如 x –0.3 –0.8 2,半径,以及起始 ...
- Makefile 从入门到放弃
//如有侵权 请联系我进行删除 email:YZFHKM@163.com { 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作, ...
- 各种版本mysql驱动包下载地址
http://central.maven.org/maven2/mysql/mysql-connector-java/
- 常用css初始化样式(淘宝)
最简单粗暴的css初始化样式就是:*{padding:0:margin:0}(不推荐) 淘宝的样式初始化: body, h1, h2, h3, h4, h5, h6, hr, p, blockquot ...