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方法进行数组空间动态分配. 如下: ...
随机推荐
- 函数的属性和方法, apply和call的区别及bind的使用
==>我的新博客中 http://www.suanliutudousi.com/2017/08/27/%E5%87%BD%E6%95%B0%E7%9A%84%E5%B1%9E%E6%80%A7% ...
- [JSOI2019]精准预测
题目 这么明显的限制条件显然是\(\text{2-sat}\) 考虑按照时间拆点,\((0/1,x,t)\)表示\(x\)个人在时间\(t\)是生/死 有一些显然的连边 \[(0,x,t+1)-> ...
- 控制音量大小widget
由于手机音量按键非常悲剧的掉了.无法控制手机音量大小.使用起来非常不方便.所以决定写一个小widget放在桌面能够随时控制音量吧.也算是解决一点便利问题. 1.一个简单的widget 由于我的需求非常 ...
- 2019-8-31-C#-直接创建多个类和使用反射创建类的性能
title author date CreateTime categories C# 直接创建多个类和使用反射创建类的性能 lindexi 2019-08-31 16:55:58 +0800 2018 ...
- node---处理get请求
const http=require('http') const querystring=require('querystring') const server = http.createServer ...
- Vim模糊查找与替换
例如要把 ( 1 ).( 2 ) - 全部替换成其他字符,可以用命令: :%s/(.*)/str/gn 其中,.* 表示匹配任何东西,如果只希望匹配应为字母和数字,可以用 \w\+. 有些特殊字符需要 ...
- thinkphp 页面Trace信息
调试模式并不能完全满足我们调试的需要,有时候我们需要手动的输出一些调试信息.除了本身可以借助一些开发工具进行调试外,ThinkPHP还提供了一些内置的调试工具和函数.例如,页面Trace功能就是Thi ...
- System.Web.Mvc.IController.cs
ylbtech-System.Web.Mvc.IController.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Public ...
- spss进行判别分析步骤_spss判别分析结果解释_spss判别分析案例详解
spss进行判别分析步骤_spss判别分析结果解释_spss判别分析案例详解 1.Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant ...
- idea for mac 项目打开的情况下import project
commad + ,进入设置页面,搜索框输入menu,选择file下面的任意一个都行: 点击打开的窗口中的others 不需要重启 参考:https://blog.csdn.net/zengxiaos ...