c语言指针,简单一句话指针就是地址

简单一句话,指针就是地址

0:网购的地址,通过这个地址找到你,

程序的地址,通过地址来操作变量,这个地址有一个叫法叫做指针,java 里面把地址就叫做引用

1:内存的单位是字节,例如一个256MB的机器,有256*1024*1024 字节的存储单位,每个字节都有一个对应的地址

通过该地址可以找到该块内存,就像我们的通讯地址一样

2:每一个变量由若干个字节组成,例如:int age = 20 由 4个字节组成,变量中第一个字节的地址称为变量的地址

#include <stdio.h>

int main(int argc,const char *argv[]){
	int age = 20;
	printf("size=%lu\n",sizeof(age));
	printf("%p\n",&age);//这个就是输出age的首地址

	//1:内存里面的每个字节都有地址
	//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
	//c语言里面只要是说到指针就是指的地址
	//3:地址,指针是常量 ,指针变量 = (指针变量)
	//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型
	return 0;
}

2:我们将变量的第一个字节的地址称为变量的指针

要去人指针和指针变量:

指针是一个地址。指针变量是保存某一个地址的变量,首先它是一个变量,只不过是保存的地址的。

3:&取地址运算符,取变量的地址

* 间接访问运算符,存取指定位置的值

变量声明的时候标识该变量是指针,使用指针变量的时候前面加上这个*,标识取该位置的值

<span style="white-space:pre">	</span>int a = 100;
<span style="white-space:pre">	</span>int *p=&a;
<span style="white-space:pre">	</span>//*p就是a的别名
<span style="white-space:pre">	</span>//对*p的改变就是对a的改变

	//&,*
	//& 取地址运算符
	int ii=100;
	printf("%p\n",&ii);//&i 三个金元宝在哪里啊?地址
	int *pp =?
	printf("%p\n",pp);//这里是%p
	printf("%d\n",*pp);//*p三个金元宝,注意这里是%d

	*pp=80;
	printf("%d\n",ii);

	ii=200;
	printf("%d\n",*pp);

4:未指向任何变量的指针,称为“悬空指针”其实就是未初始化的指针

//指针的初始化
	int *ip;//悬空地址,0x0
	printf("%p",ip);

	int b = 100;
	int *pb = &b;//初始化
	//指针变量pb
	//pb 指向了b
	//*pb 等价于b
	//*pb != pb

	int *p1;
	int j = 200;
	p1=&j;//赋值

5:指针的赋值

//指针赋值:简单的来说就是地址的拷贝
	int q = 100;
	int *pq = &q;
	printf("pg=%p\n",pq);
	int *pqp = pq;
	printf("pqp=%p",pqp);

	*pq = 200;
	printf("q=%d\n",q);
	printf("pq=%d\n",*pq);
	printf("pqp=%d\n",*pqp);

6:指针作为函数的参数

	// 指针作为函数的参数,在c语言里面默认的就是使用拷贝的形式来做的,如果想要真的切换两个变量的值,使用swapAddress
	int aa = 1,bb = 2;
	swap(aa,bb);
	printf("aa=%d,bb=%d",aa,bb);

	swapAddress(&aa,&bb);
	printf("aa=%d,bb=%d",aa,bb);
//交换两个值
void swap(int a, int b){
	int temp =a;
	a = b;
	b=temp;
}

void swapAddress(int *a,int *b){
	int temp =*a;
	*a = *b;
	*b=temp;
}

有的时候不想你改变我的参数,使用constant ,类似java 里面的final

void test(int *p){
	*p =1000;
}

void testConst(const int *p){
	//如果编译的时候下面的会报错	assignment of read-only location '*p'
	//*p =1000;
}
//有的时候不想改变呢?将参数设置为const 类似java 里面的final,
	int testp = 100;
	test(&testp);
	printf("i=%d\n",testp);

	testConst(&testp);
	printf("i=%d\n",testp);

指针还可以作为返回值:

//指针还可以作为返回值:
	int cc=100,dd=200;
	int *ee = max(&cc,&dd);
	printf("最大值为%d",*ee);

int *max(int *a,int *b){
	if(*a>*b){
		return a;
	}else{
		return b;
	}
}

++++++++++++++++++++++++++++++++++++++++++++++

#include <stdio.h>

//交换两个值
void swap(int a, int b){
	int temp =a;
	a = b;
	b=temp;
}

void swapAddress(int *a,int *b){
	int temp =*a;
	*a = *b;
	*b=temp;
}

void test(int *p){
	*p =1000;
}

int *max(int *a,int *b){
	if(*a>*b){
		return a;
	}else{
		return b;
	}
}

void testConst(const int *p){
	//如果编译的时候下面的会报错	assignment of read-only location '*p'
	//*p =1000;
}
int main(int argc,const char *argv[]){

	int age = 20;
	printf("size=%lu\n",sizeof(age));
	printf("%p\n",&age);//这个就是输出age的首地址

	//1:内存里面的每个字节都有地址
	//2:变量的地址是第一个字节的地址(首地址),地址表明了变量在内存中的位置,地址就是指针
	//c语言里面只要是说到指针就是指的地址
	//3:地址,指针是常量 ,指针变量 = (指针变量)
	//4: 指针是有类型的,就是指针类型,JAVA中的地址叫做引用,类型叫做引用类型

	//指针变量的声明和指向
	//* 表示,后面的变量是指针变量
	int i =100;
	int *p;//p是int 类型的指针,指针指向的变量的类型,指针保存的额变量地址的类型
	p =&i;//这句话,也叫做p 指向了i
	printf("int类型指针+%p\n",p);

	//&,*
	//& 取地址运算符
	int ii=100;
	printf("%p\n",&ii);//&i 三个金元宝在哪里啊?地址
	int *pp =?
	printf("%p\n",pp);//这里是%p
	printf("%d\n",*pp);//*p三个金元宝,注意这里是%d

	*pp=80;
	printf("%d\n",ii);

	ii=200;
	printf("%d\n",*pp);

	//指针的初始化
	int *ip;//悬空地址
	printf("%p",ip);

	int b = 100;
	int *pb = &b;//初始化
	//指针变量pb
	//pb 指向了b
	//*pb 等价于b
	//*pb != pb

	int *p1;
	int j = 200;
	p1=&j;//赋值

	//指针赋值:简单的来说就是地址的拷贝
	int q = 100;
	int *pq = &q;
	printf("pg=%p\n",pq);
	int *pqp = pq;
	printf("pqp=%p",pqp);

	*pq = 200;
	printf("q=%d\n",q);
	printf("pq=%d\n",*pq);
	printf("pqp=%d\n",*pqp);

	// 指针作为函数的参数,在c语言里面默认的就是使用拷贝的形式来做的,如果想要真的切换两个变量的值,使用swapAddress
	int aa = 1,bb = 2;
	swap(aa,bb);
	printf("aa=%d,bb=%d\n",aa,bb);

	swapAddress(&aa,&bb);
	printf("aa=%d,bb=%d\n",aa,bb);

	//有的时候不想改变呢?将参数设置为const 类似java 里面的final,
	int testp = 100;
	test(&testp);
	printf("i=%d\n",testp);

	testConst(&testp);
	printf("i=%d\n",testp);

	//指针还可以作为返回值:
	int cc=100,dd=200;
	int *ee = max(&cc,&dd);
	printf("最大值为%d",*ee);

	return 0;
}

时间: 2024-10-22 21:30:56

c语言指针,简单一句话指针就是地址的相关文章

【C语言】两个指针(地址)相减

两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main() { int a[9]={1,2,3,4,5,6,7,8,9}; char *p,*q; int *p2,*q2; p=(char*)a; q=(char*)&a[2]; printf("p=%08X q=%08X a[%d]=%d\n",p,q,q-p,a[q-p]); //

c语言的函数指针和函数指针数组的简单demo

今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. 1 #include <cstdio> 2 #include <Windows.h> 3 4 typedef void(*myFun)(const char*);//这里定义的一个函数类型(返回值为void,参数为const char*),类型名为myFun,使用见第28行 5 6 void(*func)(const char* name); //声明了一个函数指针,指针名

delphi指针简单入门

delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   X   and   Y   整数类型     3             P:   ^Integer;           //   P   指向整数类型的指针     4         begin     5             X   :=17; //   给   X   赋值     6

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p

C语言(四)指针概念的理解

转载请标明出处: http://blog.csdn.net/u011974987/article/details/52270018: 前言 最近真的是忙的不可开交,公司一直给安排任务,连学习和写笔记的时间都没有了,落下好几次课的笔记都没有写,所以我抽空把目前的进度给追上来,不然会越落越多.加油吧~(感觉身体都要被掏空了) 指针 我们通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位

C语言学习之路——指针初探

进来学习C语言碰到了指针,着实学了一段时间,搞不出个头绪,今日感觉有些眉目,来此做个记录,也望能给困顿的人一起分享下感悟. 学习指针还要从变量,数组,函数的定义这些基础说起. 如:int a=10; int a[]={1,2,3,4}; int max (int x,int y) { .... } 学习C语言指针我想指针变量的定义就不用说了吧. 先上一个例子然后再给大家一一展开进行讲述. #include<stdio.h>int main(){int a;scanf("%d"

嵌入式 Linux C语言(五)——指针与字符串

嵌入式 Linux C语言(五)--指针与字符串 一.字符串简介 1.字符串声明 声明字符串的方式有三种:字面量.字符数组.字符指针. 字符串字面量是用双引号引起来的字符序列,常用来进行初始化,位于字符串字面量池中,字符字面量是用单引号引起来的字符. 字符串字面量池是程序分配的一块内存区域,用来保存组成字符串的字符序列.多次用到一个字符串字面量时,字符串字面量池中通常只保存一份副本,一般来说字符串字面量分配在只读内存中,是不可变的,但是当把编译器有关字面量池的选项关闭时,字符串字面量可能生成多个

【C语言】14-返回指针的函数与指向函数的指针

前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如指针数组.指向数组的指针.指向指针的指针,呵呵,看到这些名字是否都觉得头大了,不过我就暂时不在博客中讲解这些内容了,我只讲述在iOS开发中指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 回到顶部 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯

C语言基础知识----指针数组 &amp;&amp; 数组指针 &amp;&amp; 函数指针 &amp;&amp;指针函数

指针数组 && 数组指针 char (*ptr)[5]; //定义一个指向数组指针ptr,指向包含5个char类型的数组 char *a[5]; //定义一个指针数组a,包含5个char*类型指针 #include <stdio.h> int main(void) {     char *a[5]={"red","white","blue","dark","green"};