Ⅰ 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類型的指針來表示字元串。