C语言的指针地址范围是4字节空间,即从地址0x00000000~地址0xFFFFFFFF。但其中有些字段是系统保护的或所使用的硬件平台根本就不存在,所以用户指针并不能完全使用这个空间。不过用户不必担心,只要按规范使用指针,系统都会自动正确安排。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
我们可以定义指针变量指向任何类型的变量。在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现。指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得已存放的数据或程序丢失。应使用编译系统提供的标准函数来实现地址分配。
ANSI标准建议设置了两个最常用的动态分配内存的函数malloc()和free(),并包含在slibh中,但有些C编译却使用malloch包含。使用时请参照具体的C编译版本。
我们这里所指的动态内存分配其含义是指:当定义指针变量时,其变量的取值是随机的,可能指向内存的任一单元。若指针的指向是不安全的内存地址,在该地址空间上的数据交换就会产生意料不到的效果。为此,在程序的执行过程中,要保证指针 *** 作的安全性,就要为
指针变量分配安全地址。在程序执行时为指针变量所做的地址分配就称之为动态内存分配。
当无需指针变量 *** 作时,可以将其所分配的内存归还系统,此过程我们称之为内存单元的释放。
malloc()用以向编译系统申请分配内存;free()用以在使用完毕释放掉所占内存。
[例6-21]两个字符串的交换。
#include
#include
#include
main()
{
char p1,p2,temp;
p1=malloc(30);/动态为指针变量分配长度为30字节的存储空间/
p2=malloc(20);
temp=malloc(30);
printf("inputs1:");
gets(p1);/输入字符串/
printf("inputs2:");
gets(p2);
printf("s1------------s2\n");
printf("%s%s\n",p1,p2);
scpy(temp,p1);/串复制/
scpy(p1,p2);
scpy(p2,temp);
printf("s1------------s2\n");
printf("%s%s\n",p1,p2);
free(p1);
free(p2);
}
为指针变量分配的存储空间长度取决于存放字符的多少。在上述的程序中,两个串的交换可以通过标准函数scpy()来完成,也可以通过串指针交换指向完成,用temp=p1;p1=p2;p2=temp;三条赋值语句实现。但是,利用指针交换指向,其物理意义与串通过函数进行的复制完全不同。前者是存放串地址的指针变量数据交换,后者是串在内存物理空间的数据交换。指针变量用完后,将指针变量所占的存储空间释放。
朋友那本书对指针还真的没解释多少请看下面这个例子,看了你也应该会明白了float f = 11; // 定义一个<float>型的变量f,f的值为11;float p = &f; // 定义一个<float >类型的变量 p,值为&f(也就是变量f的在内存中的地址) 注意:指针也是一个变量,只是指针有点特殊,因为它只存储地址,(简单的说,指针就是一个用来存放地址的变量,)如果不懂,就继续追问这一步你必须清楚了p = 33; // 将33的值付给p指向的变量( *** 作符又称作为间接值(indirect value) 或者解除引用(dereferencing) *** 作符)float p2 = p; // 定义一个指针p2让p2指向变量f(请记住p就是一个存放地址的变量,就像普通变量一样,这条语句就是将p中存放的地址赋给p2);p2 = p; // 先取p指向的变量(解除引用),再取p2指向的变量(解除引用),最后将p指向的变量付给p2指向的变量,(其实这里没有任何意义,因为他们都指向变量f这条语句相当于 f = f;)float temp = &p; //如果对&p取地址,那么就应该用一个二级指针()来指向它,不然就没有任何意义 (个人认为)指针的主要用途还是体现在传递大的数据类型方面(还有一点就是他可以通过地址(指针),来改变变量的值)例如,一个很大的数组,或者一个很大的结构体,int value1[1000];typedef struct { int value2; float value3; char value4[100]; } test test astTest[50];千万不要以为这只是特殊的时候其实这类复合型的数据是很常见的 当某个函数需要调用他们时,如果直接传值调用的话int function( int value1[1000], test astTest[50] );光是将原参数的值赋给函数的参数,就会浪费很多的内存,如果一个工程全是这样的函数,那么很难想象而且value1 和 astTestt的值还不会因为这个函数而改变(不信可以试试,想要改变的话,还得将数组或作为返回值传递回来) 但是如果用指针作为参数的话int function2( int value, test astTest );这样就什么问题都OK了慢慢体会一下
1:计算机给每一个内存地址都进行了编码,以明确的表示内存的位置,这个编码就是地址,用来保存地址的变量就是指针;
2:换句话说就是单独拿出一块空间(内存/变量)记录了原先变量的地址;
3:我们有了这个变量的地址(指针),那么我们就可以通过地址对这个变量进行 *** 作,
目的:
因为C语言是值传递,在一个方法内修改变量的值,不会影响方法调用外的值,指针方便我们在不同函数之间对同一个变量就行 *** 作;
scanf及fscanf、sscanf等函数的原理是将数据读入到以某个内存地址为起始的长度为格式控制字符串给定的数据类型长度对应的连续内存空间内。例如scanf("%d",0x401040)代表从输入流中读取一个整型数,并将它保存到内存地址0x401040开始的相当于int型长度的内存空间内(x86上为4个字节)。因此,对于整型变量a来说,应该用scanf("%d",&a)代表将数据读入并保存到a对应的地址空间内。这是&stu[i]grade前面为什么需要取地址符&的原因。而对于char id[10]来说,id是一个char型数组名同时也是指向该数组首元的指针名,即id是一个char型指针。而我们都知道指针本身保存的就是内存地址的值,因此直接用scanf("%s",id)就可以将一串字符读入id所指向的内存空间内。注意前面的格式控制符%s代表一个不含空白符号的字符串。
1、
&a是取a变量的内存地址,把这个地址值存入b变量逻辑上是没有问题的。
但存地址有专门的存地址的箱子的类型(int),b是存整数的箱子类型(int)啊,所以应该进行显式(强制)类型转换,变成:
1 int a=100;
2 int b=(int)&a;
2、
在定义变量语句中的int b和表达式中的b确实不代表同一个意思。int b中的和int一起代表一种整型的指针类型,你可以将int作为一个整体来理解,它表示一种类型。表达式中的b才是做指针运算的,表示取出b的值所表示的地址中的值(b所指向的地址中的值)。
以上就是关于C语言指针的地址范围是多少全部的内容,包括:C语言指针的地址范围是多少、C语言-基础教程-指针的地址分配、c语言指针地址的全部表示方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)