『壹』 c語言 指針數組的使用
int**a可以表達一個二維數組。為什麼呢?
你可以這么理解*p[3]表達的是一個數組指針,這個指針p[0]表示的是數組存的第一個地址。而數組實際上是一串連續地址的塊。每一個小塊存著一個內容。每次訪問數組時,你為什麼可以用數組名+下標訪問呢?//比如a[i];
實際上就是訪問*a+i;*這個符號可以表示你存的是變數的地址。而數組地址的第一位為int類型變數存的地址(你可以直接使用數組的地址加上單位變數的空間的大小去訪問下個元素)。在這個程序中int*p[3]表示可以存三個int類型的地址。而p正好把二維數組的三個一維數組的開頭的int類型變數的地址給存起來了。
給你舉個例子
實際上p[i]與 *(p+i)是表達的是同一個意思。只不過只有數組可以定義一個連續的空間
(數組的第一個地址是隨機的其他的是連續的。)單獨用指針的話會隨機分配的
數組的指針可以存三個地址。當然可以訪問二維數組了。
『貳』 如何正確地使用C語言的指針
指針是C語言中的精髓,它能直接對物理地址進行訪問,具有雙重功能,是嵌入式設計中必不可少的一門語言。C語言功能強大的主要原因就是具有指針結構。指針是一種特殊的數據類型,直接指向目標的存儲地址,實現直接訪問對象存儲空間的功能。
1、指針指向變數:
下面有這樣一個代碼塊:
int main()
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void test(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}
最後輸出的結果還是a=10,b=15。因為在函數調用時,實參和形參之間只是值傳遞。但我們使用指針結果就不一樣了,如:
int main()
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
void test(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}
輸出結果a=15,b=10。變數a和b的值發生了交換。這是因為我們利用指針訪問變數的存儲單元,間接修改變數的值。
2、指針指向數組:
定義一個數組並初始化,int array[5]={2,5,12,7,8},定義一個指針變數並把數組的地址賦給它,int *p=array,注意數組名就是數組的地址,而且數組的地址就是首元素的地址。因此我們的指針變數就指向了數組的首元素,*p=2。如果把(p+1),那麼指針變數就指向了數組的下一個元素5,因此我們可以利用指針來遍歷數組的各個元素:
int main()
{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}
3、指針指向字元串:
我們都知道用數組存儲字元串,如char name[20]="jack",上面已經簡單講述了指針指向數組,所以我們可以這樣做,char *name="jack",指針變數指向字元串的首個字元並可以依次訪問字元串的各個字元。
4,指針指向函數:
我們需要知道怎樣表示一個指針指向函數,說白了就是語法要正確,下面我也取一個代碼塊來說明一下:
int sum(int x,int y)
{return x+y;}
int main()
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}
不難發現上面代碼塊里語句(*p)(a,b)可以用p(a,b)來代替,因為p和sum就是一樣的,只是用前者可能更容易理解一點。而我們要知道怎樣定義一個指針指向函數,int (*p)(int,int)這是固定寫法,前面的int是指針將來指向的函數的返回值的類型,如果沒有函數返回值,那就是void,後面括弧里的兩個int 當然就是指針將指向的函數的形參。指針指向函數用起來確實有點抽象,要想熟練運用的話就多去做一些這方面的練習吧!
5,指針指向結構體:
我們首先首先定義一個結構類型,
struct student
{
char *name;
int ages;
};
再根據類型定義結構體變數 struct student stu={"Rose",15};定義一個指針指向結構體類型,struct student *p;把結構體變數stu的地址賦給指針變數p,p=&stu;我們可以有3種方式來訪問結構體中的屬性ages:
stu.ages=15;(*p).ages=15;p->ages=15;不過第三種方式在C語言中只能用來指向結構體。
綜上所述,指針的基本用法就是這幾種,還有些用法不常見的在此就一一例舉了,有興趣的話可以去翻閱相關的資料。
『叄』 C語言中關於指向數組的指針
char str[100];
char *pi=str; //相當於char *pi ;pi=str;
char **ppi=*pi;//這個地方抄錯了。應為char **ppi=&pi;
定義加*表明這是指針類型的變數
用的時候,就是用的指針,加*干什麼。
只有取指針所指變數的值,或給指針所指的變數賦值的等涉及指針所指的變數的時候,
才會又加*號,表示獲取或改變,指針所指變數的值。
char x=10;
*pi =x; //給指針所指的變數賦值,改變指針所指變數的值(改變*pi) 。
x=*pi; //取指針所指的值,取指針pi所指的變數的值(表示為*pi)賦值給x。
『肆』 c語言指針數組
p是int類型指針,指向數組a的第1個元素即一個一維的數組{1,2,3}首地址所以p[1]相當於a[0][1]所以printf("%d\n",p[1]);
輸出2 。 int **pp =pa 是聲明了一個指向pa的指針,而pa又是指向a首地址的int類型指針。pa指向的是a的第一維,pa[0] = a[0] ,pp[2][1]相當於a[2][1]而a數組的[2]中只初始化了[2][0]位置的7,那[2][1]位置就是默認的值0,所以printf("%d\n",pp[2][1]);
輸出0
『伍』 c語言數組指針
② 指向iArray[1]輸出2 (因為*(++p)是先自加然後取指針內容)
③ 指向iArray[1]輸出4 (因為②時p已經成了1,p+2就是3,iArray[3]就是4)
④ 指向iArray[0]輸出2 (因為*(p--)相當於 *(p) ;p--; 是先取值, 然後自減,自減後p=0)
/******
④有異議 不管怎麼樣, 輸出的都是2 ,因為假如是 printf("%d",$(p--)); 則是 printf("$d,$p");p--; 就是輸出的時候, p是指向iArray[1], 但是輸出後就變成了指向iArray[0]了,-----------這里問的p指向:如果是輸出時的指向, 就是iArray[1],如果是輸出後的指向, 就是iArray[0] ,因為這里先問的輸出,又問的指向,所以當作是輸出後指向 所以是iArray[0]
*******/
⑤ 指向iArray[0]輸出1 (因為*p++ 是得到p指向的值之後,把那個值自加 ,但是*p++是先使用*p然後*p自加所以輸出的時候還是*p的內容 ,但是注意, 這時*p已經是2了,也就是iArray[0]從1變成了2)
⑥ 指向iArray[0]輸出2 (因為p是指向數組的索引0的位置,⑤中指針位置沒變,變得是裡面的值,本來是1, ⑤之後變成了2)
⑦ 指向iArray[0]輸出3 (因為++(*p)是取出*p之後, 自加, 然後輸出,所以*p是2 2++是3)
⑧ 指向iArray[0]輸出3 (⑦中沒改變指針, 只改變了指針指向的位置的值, 是⑦中2++的結果,是3)
/*
這里考驗的是i++ 和++ i的區別
比如 a=i++; 相當於 a=i; i++;
而 a=++i ; 則相當於 i++;a=i;
一個是先賦值再遞加,一個是先遞加再復制
另一個是考*p++和*(p++)的區別, *p++改變的是*p的值就是指針指向的值 , 而*(p++)改變的是p的值
*/
『陸』 如何在c語言二維數組中使用指針
程序中有些問題:
1、函數的定義有錯誤(參數格式不對);
2、程序中沒有調用函數(或者說是調用格式有誤)
3、函數中的處理邏輯需要修改(一步一步來,這樣容易處理和理解)。
你定義的函數是使用數組作為參數的,數組名本身就是個地址(相當於指針)。
下面在手機上用易歷知食軟體里的微C程序設計來演示修正後的代碼並運行程序,供參考。
手機上修正後的代碼如下圖:
手機上運行的效果如下圖所示:
『柒』 c語言中數組指針的表示方法
(*k)[3]意為指向包含三個整形元素的一位數組;
*k[3]意為一個數組,數組的每個元素都是一個指針
以下為實例:
#include <stdio.h>
#include <conio.h>
void main(void)
{
int (*p)[3];
int a[2][3]={1,2,3,4,5,6};
p=a;
//假設我們想輸出第二行,第三個
printf("%d",*(*(p+1)+2));
getch();
}
#include <stdio.h>
#include <conio.h>
void main(void)
{
int *p[3];
int a=0,b=1,c=2;
p[0]=&a;
p[1]=&b;
p[2]=&c;
printf("%d,%d,%d",*p[0],*p[1],*p[2]);
//輸出結果為 0,1,2
}
不懂再問
『捌』 c語言中的數組指針
這時b代表數組第一個元素b[0][0]的地址,*b就是b[0][0]的值
1.
*b+1表示b[0][0]+1的值
2.
*(b+1)
首先地址b加一,此時就是b[0][1]的地址,故此表達式相當於*(&b[0][1]),也就是b[0][1]的值
3.
*(b+1)+1
由上面知此式表示b[0][1]的值加1
『玖』 C語言數組指針
1數組指針強調是一個指針,這個指針指向的是一個數組,把數組名給這個指針就是對數組指針賦值了。
2二維數組里的每個元素是什麼要看你把這個二維數組定義成什麼類型,例如:char num[3][3],數組里每個元素是為char類型開辟的那麼大的一塊內存,可以存char類型數據。二維數組名是整個二維數組的首地址,a=&a[0]=&a[0][0]=a[0]值都是二維數組的首地址的值。
指針數組名是一塊開辟好的內存的首地址,是常量,比如a[0],指向數組的第一塊內存區域,那塊內存區域里是可以賦值的,明白了吧。
char *ss[6];ss[1]="right?"這句先定義一個char類型的指針數組,強調是一個數組,里邊的元素是指針,指針是指向char類型數據的,ss[1]是指針數組的第二個元素,是一個指針,指針的指向是「right」字元串的首地址。
char ss[6][20];ss[1]="right?"是定義一個二維字元數組,橫6縱20,起迷惑作用的!二維數組里ss[0], ss[1]等代表的是第一行,第二行的首地址,ss[0][3]是第一行第四個元素,ss[1][3]代表第二行第四個元素。
3第三個問題再用我講你就直接改行吧!!哈哈哈
祝你學習進步!!
『拾』 C語言數組指針的具體用法
同意樓上!
不能定義*d[0],因為這個數組的大小為0!
可以這樣來
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此時*d[]為一個指向指針的指針
d[0]=malloc(1*sizeof(char));
此句話的意思是,分配1個位元組的內存空間給d[0],也就意味著d這個數組的第一個元素[0]內保存的是一個1位元組空間的地址,因為d[0]指向一個地址!
你可以這樣理解
對於普通的數組(例如 char d[4];),在內存中是這樣的
變數:內存地址:內容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此處 char *d[4]; *d[0] = malloc(1*sizeof(char));,是這樣的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在內存0x400100h處
才保存著"web\0"
不好意思,我上面說錯了,應該是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在內存0x400100h處
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
對應的,你的代碼執行後,內存變數應該是這樣的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在內存0x400100處:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:隨機字元
......
0x400108h:隨機字元
以上內存地址是以位元組方式內存對齊的,用一些編譯器編譯後可能地址會有些問題(比如d[0]到d[1]不止差了4,可能是8),但總體框架就是這樣!