您的位置:

指针c语言编程,C语言程序设计指针

本文目录一览:

C语言用指针编写程序

#includestdio.h

#define N 5

#define M 5

void f(int a[][M],int n,int m,int *s) { int i,j;

  for ( i=0;in;i++,s++ ) {

    *s=a[i][0]; for ( j=1;jm;j++ ) if ( *sa[i][j] ) *s=a[i][j];

  }

}

void main() { int a[N][M],s[N],i,j;

  for ( i=0;iN;i++ ) for ( j=0;jM;j++ ) scanf("%d",a[i][j]);

  f(a,N,M,s);

  for ( i=0;iN;i++ ) printf("%d\n",s[i]);

}

C语言中指针的用法介绍(2)

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘 sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ptrold加上一个整数 n后,结果是一个新的指针ptrnew,

ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了 n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了 n乘 sizeof(ptrold所指向的类型)个字节。

一个指针ptrold减去一个整数 n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了 n乘 sizeof(ptrold所指向的类型)个字节,就是说, ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

第三章。运算?amp;和*

这里是取地址运算符,*是...书上叫做"间接运算符"。

a的运算结果是一个指针,指针的类型是 a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a 的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

例五:

int a=12;

int b;

int *p;

int **ptr;

Generated by Foxit PDF Creator ? Foxit Software

For evaluation only.p=a;//a的结果是一个指针,类型是 int*,指向的类型是 int,指向的地址是a的地址。*p=24;//*p的结果,在这里它的类型是 int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=p;//p的结果是个指针,该指针的类型是p的类型加个*,在这里是 int**。该指针所指向的类型是p的类型,这里是 int*。该指针所指向的地址就是指针p自己的地址。

*ptr=b;//*ptr是个指针,b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用b来给*ptr赋值就是毫无问题的了。**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指

针再做一次*运算,结果就是一个 int 类型的变量。

第四章。指针表达式。

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

下面是一些指针表达式的例子:

例六:

int a,b;

int array[10];

int *pa;

pa=a;//a是一个指针表达式。

int **ptr=pa;//pa也是一个指针表达式。

*ptr=b;//*ptr和b都是指针表达式。

pa=array;

pa++;//这也是指针表达式。

例七:

char *arr[20];

char **parr=arr;//如果把arr 看作指针的话,arr 也是指针表达式

char *str;

str=*parr;//*parr 是指针表达式

str=*(parr+1);//*(parr+1)是指针表达式

str=*(parr+2);//*(parr+2)是指针表达式

由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

在例七中,a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针 pa,既然 pa 已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

第五章。数组和指针的关系

Generated by Foxit PDF Creator ? Foxit Software

For evaluation only.如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;如何理解c 和c++的复杂类型声明。数组的数组名其实可以看作一个指针。看下例:

例八:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

...

...

value=array[0];//也可写成:value=*array;

value=array[3];//也可写成:value=*(array+3);

value=array[4];//也可写成:value=*(array+4);

上例中,一般而言数组名array代表数组本身,类型是 int [10],但如果把array看做指针的话,它指向数组的第 0个单元,类型是 int *,所指向的类型是数组单元的类型即 int。因此*array等于 0 就一点也不奇怪了。同理,array+3 是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

例九:

例九:

char *str[3]={

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可写成strcpy(s,*str);

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名 str 当作一个指针的话,它指向数组的第 0号单元,它的类型是char**,它指向的类型是char *。

*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即’H’的地址。

c语言指针详解

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。

为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。

当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。

如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。

变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

扩展资料

指针使用(* 和 )

*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;。