Ⅰ c语言中指针有哪些用处。或者可以用来做什么,请简单举例说明
指针可以快速访问数组中的元素,想访问下一个,就自加1,上一个就自减1,下一行就自加一行,上一行就自减一行,特别适用快速逐点处理图像,
如:unsigned char img[1024][768],*p; int i,j; p=(unsigned char *)img; for ( i=0;i<1024;i++) for ( j=0;j<768;j++,p++ ) *p+=16;
指针还可以用不同类型来访问同一组数据:
unsigned char a[4],*p; unsigned int *q; p=a; *p=0x12; p++; *p=0x34; p++; *p=0x56; p++; *p=0x78; q=(unsigned int *)a; printf("%xH",*q);会输出十六进制数78563412H
另外指针可以用于给函数传递数组起始地址、结构地址、类地址、结构数组地址,这些复杂数据组合,函数返回值也是这样,另外利用指针还能不从数组起始地址开始传入数组。比如:char str[]; scanf("%s",str); printf("%s\n",str+1);
Ⅱ C语言指针使用
*p[10]是一个指针数组,含有10个元素,每个元素都是一个指针。
(*p)[10]是一个数组指针,指向一个有10个元素的数组。
假如有int
ST[10][15],
那么应该定义指针int
(*p)[15]
p=ST;
将数组赋给指针
p指向二维数组的第一行,
p+1指向第二行
p+2指向第三行
Ⅲ C语言指针的作用有哪些
指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行,大大提高了效率。简单地说指针就是指向变量和对象的地址。
Ⅳ 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
http://www.foxitsoftware.com 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
http://www.foxitsoftware.com 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语言指针怎么用
在c语言中.指针被用来表示内存单元的地址,如果把这个地址用一个变量来保存,则
这种变量就称为指针变量。指针变量也分别有不同的类型,用来保存不同类型变量的地址。
严格地说.指针与指针变量是不同的,为了叙述方便,常常把指针变量就称为指针。
内存是计算机用于存储数据的存储器,以字节作为存储单元.为了能正确的访问内存单
元,必须为每一个内存单元编号,这个编号就称为该单元的地址。如果将一个旅店比喻成内
存,则旅店的房间就是内存单元,房间号码就是该单元的地址。
指针变量定义格式:
[存储类型]
数据类型
*指针变量名[=初始值]
指针变量一旦定义,必须采用赋值的方式将其与某个变量实体相联系,才能使用。指针
变量的赋值方式:
指针变量名;&普通变量名;
Ⅵ C语言指针的用法
void inv(int *x,int n) // x表示一个int的指针,或者int类型的数组,n表示一个int变量,从参数上看,可能x是数组,n是数组大小
{
int *p,temp,*i,*j,m=(n-1)/2;//变量定义,p,i,j,都是指针,temp,m,都是变量
i=x;j=x+n-1;p=x+m;// 给指针i,j,p赋值,让i指向数组x的第一个元素,j指向x的最后一个元素,p为x的中间的元素
for(;i<=p;i++,j--) // 循环 从 第一个元素开始,到中间的元素结束,
{temp=*i;*i=*j;*j=temp;}
交换 第z个元素和倒数第z个元素,典型的交换算法,z表示i每次循环所指向的数字的索引
return;
}
Ⅶ C语言里的指针怎么用
*p:是数据指针。
**P:是变量指针。
***P:呵呵,我没见过。
所谓指针可以简单的理解为是一个间接访问的地址。如有一个变量a,如果要访问则可以直接写a时行访问,用指针的话则P=&a,以后再写下面的程序时P就等于变量a,&是变量所在的地址。
**P是指向指针的指针。如有一指针*S,用**P做为指针变量。P=S是P所指向的是指针S的地址。
Ⅷ C语言指针的用法
#include<stdio.h>
#include<math.h>
#include <conio.h>
void sort(char *a[],int n)
{
int i,j;
char *temp;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(strcmp(a[i],a[j]<0))
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
int main()
{
char *a[3];
int i;
for(i=0;i<3;i++)
a[i] = (char *)malloc(sizeof(char));
for(i=0;i<3;i++)
scanf("%s",a[i]);
sort(a,3);
for(i=0;i<3;i++)
printf("%s\n",a[i]);
getch();
}
应该改成这样
其中
char *temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
做了修改
原因如下:未修改前temp是一个字符变量,而*a[i]是指针a[i]所指向的内容,就把需要交换的字符串的首字符交换了。
你要交换的是指针或者说是地址,而不是指针里的内容。这就是问题所在。
在temp前加*就表示temp也是个指针,再把a[i]前的*去掉,就实现了交换指针地址的目的。
指针的声明要加*例如
int *a;
使用的时候如果事指针操作则不要带*例如
char *a = “hank”;
a++;此时a指向的字符串就变成了“ank”
涉及到指针指向的内容的要加*例如
char b = *a;
指向数组的指针,例如
int b[10];
int *a = b;
a就是b[0]的地址*a就是b[0]的内容
a+1就是b[1]的地址依此类推
又如char *a = "hank";
那么通过a就能得到整个字符串"hank"
*a是h
*(a+1)是a
...
STRCMP是c语言函数库中的函数
虽然传参传的是指针,但是具体比较的时候比较的是里面的内容。具体涉及到指向数组的指针的应用。因为c中没有String类型,所以就只能使用char类型的指针来表示字符串。