1 例如 int * p[10];//声明一个指针数组
*p[3]表示间接访问数组里的第三个指针指向的变量。
(*p)[3] 表示的是访问这个数组的第一个指针指向的位置再偏移三个单位的变量。
数组名就是一个常量指针,*(p+1)p[1] 基本上没区别。
2 char 1 个字节 shor int 2 long int 8 int 4 float 4 double 8 这个也跟电脑位数有关,像INT在16位上是2 32位上是4 64位上应该是8 到是64上的还是4 这个编译器有关吧,限制住了
3 如果是无符号 就是UNSINGED 就是不表示负号 但是一般 二进制的开头会有一位用来表示负号,剩下表示数值,这就是原码,还有补码,反码,这个你愿意知道的话,可以网络一下。
八进制 十六进制都会按二进制算 因为电脑就认识 1 和0
B. C语言指针的用法
1、指针的概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];
1、指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
(1)int*ptr;
//指针的类型是int*
(2)char*ptr;
//指针的类型是char*
(3)int**ptr;
//指针的类型是int**
(4)int(*ptr)[3];
//指针的类型是int(*)[3]
(5)int*(*ptr)[4];
//指针的类型是int*(*)[4]
怎么样?找出指针的类型的方法是不是很简单?
2、指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
(1)int*ptr;
//指针所指向的类型是int
(2)char*ptr;
//指针所指向的的类型是char
(3)int**ptr;
//指针所指向的的类型是int*
(4)int(*ptr)[3];
//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];
//指针所指向的的类型是int*()[4]
在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
本篇文章来源于 黑基网-中国最大的网络安全站点 原文链接:http://www.hackbase.com/lib/2008-03-09/13993.html
C. c语言,数据储存,指针问题
地址那一串数字也是放在一个专门的空间中存储的,称作指针的指针,例如
int a=5;
int *pa=&a; //pa指针中存储了变量a的地址
int **ppa=&pa //ppa指针,其中存储了指针pa的地址,也就是你说的那一串数字
至于变量a的名称会在编译的时候生成一个符号列表,程序中所有的符号都会记录在这个表中,这些是C语言编译器必须完成的功能,作为普通程序员,只需知道这些基本原理,并知道如何使用这些内容即可,毕竟我们不是去做出一个C语言的编译器。
D. c语言指针详解
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。
为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。
当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。
如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。
需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
(4)c语言指针存取数扩展阅读
指针使用(* 和 &)
*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。
&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。
对星号*的总结
在我们目前所学到的语法中,星号*主要有三种用途:
1、表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
2、表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
3、表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
E. C语言中,如何定义一个‘指针数组’,这个‘指针数组’专门用来存放‘数组指针’。
指针数组定义int*p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,
这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样*p=a;这里*p表示指针数组第一个元素的值,a的首地址的值。
数组指针定义int(*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
(5)c语言指针存取数扩展阅读:
与数组指针关系
数组指针是指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);指针数组是数组元素为指针的数组,其本质为数组。
例如:*p[2]是指针数组,实质是一个数组,里面的两个元素都是指针,[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
与二维数组对比
二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。
指针数组:如char*str_B[5]系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。
如果我做这样的定义:
char a[3][8]={"gain","much","strong"};
char*n[3]={"gain","much","strong"};
他们在内存的存储方式分别如右图所示,可见,系统给数组a分配了
3×8的空间,而给n分配的空间则取决于具体字符串的长度。
此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。
由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。
举例编辑
数组指针:
#include<stdio.h>
int main()
{
char c[][4]={"哥","哥","我","岸","上","走"};//UTF-8:一个汉字=3个字节
char(*p)[4];
int i;p=c;//将指针定位于c[0]
for(i=0;i<=5;i++)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*p++
}
printf(" ");
for(i=5;i>=0;i--)
{
printf("%s,",*(p+i));//或者将*(p+i)替换成*--p
}
return 0;
}
指针数组:
#include<stdio.h>
int main()
{
int i;
char*pch[6]={"妹","妹","你","坐","船","头"};
for(i=0;i<6;i++){
printf("%s,",pch<i>);
}
printf(" ");
for(i=5;i>=0;i--){
printf("%s ",pch<i>);
}
return 0;
}
F. c语言文件读写,如何正确的存取多位数(int)
C语言将整形数据存储到文件中,可采用两种方法,1、二进制存取 2、字符方式存取。
因存储方式的不同,读取也要采用相应的方式进行操作,否则不能正确得到存储的数据。
二进制存取
二进制方式是将原数据的内存格式存储到文件中,在同类型的机器上可以正确的读取。但如果换成不同类型的机器则会出现数据解释错误,因此,具有不可移植性。
这种方式,采用的存取函数相应为:fwrite()和fread().
如:
int num=12345;
FILE *fp=fopen( "datafile", "wb" );
fwrite( &num, sizeof(int), 1, fp ); //将num数据写入文件
....
FILE *fp=fopen( "datafile", "rb" );
fread( &num, sizeof(int), 1, fp ); //读文件数据到num中
字符方式存取
字符方式是将数据的可见内容,以字符形式存储到文件中,可以在任何机器上阅读并读取,方便不同系统间的数据传递。
这种方式,采用的存取函数相应为:fprintf()和fscanf().
如:
int num=0;
FILE *fp=fopen( "datafile", "w" );
fprintf(fp, "%d ", num ); //将num数据写入文件
....
FILE *fp=fopen( "datafile", "r" );
fscanf(fp,"%d", &num ); //读文件数据到num中
G. c语言 指针 字符存取问题
需纠正两个问题:
(1) *p2 结尾处少了一个字符串结束符号。要加上。
(2) 输出前,要把指针拨回到起始点, p2=&b[0]; 或 p2=b;。
for( ; *p1!='\0'; p1++,p2++) { *p2=*p1; }; 这句以后要添加:
*p2='\0'; p2=b;
然后再: for(;*p2!='\0';p2++)printf("%c",*p2); 输出,就正确了。
H. c语言中,字符串指针怎样实现对字符串的读取与存储
比如char s[30];
数组名s可以看作数组的首地址,可以直接对它进行操作;
或用一个char指针:char *p(注意:"字符串指针"没有这个说法,可以叫做指向字符数组的指针)
p = s;或p = &s[0];用指针p指向s数组的首地址。
不知读取是指打印还是引用;假如要访用一个元素,可以用*(p + i),i指偏移量相当于p[i];也可以把p当成数组名用,比如p[2]指的是数组s的第三个元素,假如把‘a’赋给第n个元素:*(p+n-1) = 'a';或p[n-1] = 'a';
如果直接用指针存个字符串:前提是字符串大小不能超过30 - 1;scanf("%s",p);复制可以使用
strcpy(p,"..........")等;
如果不通过指向字符数组:那么必须要内存分配,用到malloc函数;
例如p = (char *)malloc(sizeof(char) *30);给指针p分配一个大小30字节的内存用来存储字符串;
接下来和上面差不多,不过p[30]必须是有结束符'\0';
I. c语言指针用法
1、使用场景
使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a数组首地址
//*b=2; 无法直接初始化
//printf("%d ", *b);
e=e+2; //移动两个地址单元
d=&c; //d指向c的地址来表示值
c=4; //修改原c变量的值,d指针的值会发生改变
b=(int *)malloc(sizeof(int));//为b分配一个int型空间来直接存储值
*b=2;//分配空间后可以直接赋值了
printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);
2、类型说明
(1)int *a :表示一个指向int型变量的指针,指向的是变量的地址单元
(2)char *b:表示一个指向char变量的指针
*a表示的是这个指针指向地址的值,a为此指针本身的地址,这点要明确,一般用*(a+1)、*(a+2)来表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p ",*a,*(a+1),a);
(9)c语言指针存取数扩展阅读:
指针的运算
指针指向变量地址,若原变量的内容发生了变化,它本身也会发生变化,指针之间的运算一般为值运算和地址运算
(1)值运算:直接通过*运算方式,像a+*(a+1),结果为第一个元素与第二个元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址运算:通过a+i的方式.指针会指向a的下i个地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d ",*a);
结果输出2。
参考资料来源 :指针-网络
J. c语言指针存取问题
*是解引用运算符 &是取地址运算符
*p=&a这样写是p是指向指针的指),这时候*p前面要有类型符(比如int等),通常的情况是这样用的int *p=&a;这一句作用相当于int *p; p=&a; 两句,这句话的意思是定义一个int类型指针,然后用a的地址给p赋值;