C语言,指针
来源:互联网 发布:python初学者的书籍 编辑:程序博客网 时间:2024/06/15 11:20
sizeof //是一个运算符,给出某个类型或变量在内存中所占据的字节数。
sizeof(int) //算int占字节
sizeof(i) //算 i这个变量占多少
运算符&
作用:获得变量的地址,它的操作数必须是变量
int i; printf(“%x”,&i); //这个是获取i的地址。 得到的结果是在内存中i的地址。但这个是不正确的,获得地址应该用%p.
//32位结构和64位架构的相同变量,所占空间是不一样的
*&不能取的地址:必须要明确的变量就可以。反之,则不能。
对于数组地址 &a=a=a[0]
指针
scanf的工作原理。
指针类型的变量就是保存地址的变量。
int i;
int* p= &i; //p指向了i
int* p,q; //下面两行的意义是一样。都是说p是一个指针变量指向了int i,但是q只是一个普通的int q。*在int边上还是在变量边上都是一样的意思。
int *p,q;
指针变量
变量的值是内存的地址。
普通变量的值是实际的值。
指针变量的值是具有实际值的变量的地址。
作为参数的指针
void f(int *p)
在被调用的时候得到了某个变量的地址。
int i=0; f(&i);
在函数里面可以通过这个指针访问外面的这个i。
#include<stdio.h>void f(int *p); int main(){ int i = 6; printf("&i=%p\n", &i); f(&i); return 0;}void f(int *p){ printf(" p=%p\n",p);}
上面代码的图解。
6是值,70是地址。 把i地址的值传给了p。
访问那个地址的变量
“*”是一个单目运算符,用来访问指针的值所表示的地址上的变量。
可以做右值也可以做左值。
int k =*p;
*p=k+1; //这样的做法会使得 p所指地址的内容的值发生改变。
问:为什么 int i; scanf(“%d”,i); 编译不会报错?
对于scanf其实它也是一个函数,对于他而言。他认为,你的i是一个地址,但是你其实给他的是一个值。所以编译会报错,但是运行一定会错。因为scanf把它写错到了一个很奇怪的地方。
指针与数组
如果一个数组传到了函数中,那它组成了什么?
函数参数表中的数组实际上是指针
sizef(a) == sizeof(int*)
但是可以用数组的运算符[]进行运算
数组变量是特殊的指针,数组变量本身表达地址,所以
int a[10]; int *p=a;//无需用&取地址(int *p=&a 没必要)
但是数组单元表达的是变量,需要用&地址,即,*p=&a[1];
同时 a的地址==a[0]的地址
[]这个运算符。可以对数组做,也可以对指针做
p[0] == a[0]
*运算符可以对指针做,也可以对数组做;*a=25;
数组变量是const的指针,所以不能被赋值,两个数组之间不能互相赋值。但是 int b[]; int *q =b; 这样是可以的。因为对于int b 可以看做成 int *const b; 所以他是一个常量,创建出来即不能代表别的数组。
- C语言中的指针
- C语言指针问题
- C语言野指针
- C语言之指针
- C语言指针简介
- C语言的指针
- c语言指针点滴
- C语言的指针
- c语言指针简介
- c语言 数组 指针
- c语言指针详解
- 理解C语言指针
- c语言函数指针
- C语言指针
- C语言之指针
- c语言指针详解
- c语言中的指针
- C语言--指针,数组
- forward与sendRedirect区别
- linux添加用户和用户组
- Android Button常用属性
- border
- 【蓝桥杯题】之 算法训练-寂寞的数
- C语言,指针
- jquery的on、off、one、bind、delegate、live、die绑定事件方法研究
- Spring Boot:简单Hello World
- Android GridView获取其中任意子View(并操作)详解
- ModelMap和ModelAndView的作用
- 搭建包含3台机器的Replica Set
- 注册树模式
- DKNightVersion框架的原理和使用
- SQL Server中关于跟踪(Trace)