1. c語言中怎麼定義一個字元串數組指針
c語言中定義一個字元串數組指針可以這樣寫:
//Exampleprogram
#include<stdio.h>
intmain()
{
螞慎罩charstr[]="abc";
悶鬧char*p=str;
printf("%s ",str);
printf("%s "孝旁,p);
return0;
}
2. c語言中怎樣定義文件指針
FILE
*fp
這就是
文件指針
定義方式啊
還問
文件指針怎麼定義?
你是想知道FILE是什麼吧?
它是一個
結構體
:
struct
_iobuf
{
char
*_ptr;
int
_cnt;
char
*_base;
int
_flag;
int
_file;
int
_charbuf;
int
_bufsiz;
char
*_tmpfname;
};
typedef
struct
_iobuf
FILE;
3. 在C語言中,創建一個指針變數,但是不賦值,是否就是空指針
對於未初始化的變數,編譯器會給它們一個默認值,這個默認值是未知的(也許是NULL,也許是其他的),任何使用未初始化的變數的行為都是有隱患的。
4. c語言,在函數中創建的指針,在其他函數中能直接調用嗎
能啊,在參數里調用指針其實只是用的只是地渣閉侍址如吵,下面的程序就是調用態租數組a的首地址。
int reform(int *q,int n)
{....}
main()
{
int a[10],*p;
p=a;
reform(p,10);
}
5. 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;
}
6. C語言編如何寫指針函數
1
#include<iostream>
using namespace;
void main()
{
int a=0,b=0;
int *s=a;int *p=b;
cout<<「please the two numbers」;
cin>>a;
cin>>b;
int fun(int *a,int *b)
{
if(*a==*b)
{
cout<<"different\n";return 1;
else cout<<"same\n"; return 0;
}
fun(s,p);
}
include<iostream>
using namespace std;
void main()
{
int a[10]={0};
int i=0,j=0,k=0,p=0,m=0;
int *x=a;int *n=a;
for(;i<=9;++i)
{
cout<<"input the "<<i+1<<"number(s)";
cin>>a[i];
}
int fun(int *a)
{
for(;*x!=null;++x)
for(;m<=9;++m)
{
if(*x<a[m]) break;
n=x;
}
cout<<"the max is"<<*n;
}
7. C語言 程序編程 指針
指針也是一個變數,它也需要進行賦值。指針所存儲的東西不是什麼特別的,猶如普通的整型變數int x ,x可以存放一個整數一樣, 那int *p 的p則可以存放一個內存地址。所以指針變數中所存放的內容就是一個內存地址。
所以經常的做法是將一個「地址」賦值給一個指針變數,那如何取到一個地址呢,C語言中就提供了一個運算符&, 稱該運算符為取地址運算符,它可以獲得一個變數的地址,如int x; 那麼&x就是變數x所在內存單元的地址了。這樣你可以把它賦給一個指針變數即 p = &x; 我們形象的說p指向x,其實就是p的內存單元中存放了變數x的地址。
通過上述的賦值給對於x這個內存單元我就可以有兩種訪問方法,也就是說我有兩種方式使用x
第一種直接法,就是x, 比如我要更改x變數的值,就是更改x所在內存單元中存放的數據,
x=5,就是把5存放到悉喊x所在內存單元。這是很顯然的方式。
第二種間接法,由於之前已經讓一個指針變數p指向的x即p= &x了,所以我可以通過p間接的訪問x,怎麼訪問呢? 這里C語言又提供了一個運算符*, 你肯定不陌生,它就是乘號啊, 沒錯它是乘號,但這里它有另一個作用就是「間接訪問」芹塌,通過*運算符我們可以間接訪問x這個內存單元。
你可能已經清楚點了就是*p 就是說*p的值就是x, x的值就是*p, 所以這里容易產生一種概念
*p==x 有這個表達式存在且為真。 沒錯它確實為真。
但是錯誤就容易從這里產生了,因為*p==x,容易產生這種想法,那麼我把x賦值給*p, 即*p=x會有錯嗎? 理解方式就是*p即然代表了一個值,它在此處就是x, 那我要改變*p的值, 用*p=x 這沒有問題吧? 肯定有, 這里*的作用一定搞清是「間接訪問」, 間接訪問的話首先它就得有一個指向的對象,也就是說必須有p=&x的前提,有可能有*p=x, 無此前提的話真接使用*p就是空談,因為指針變數p是存在,但是p中存放的內容是什麼並不確定,它並沒有存x的地址啊,程序也不會那麼聰明的你這里睜首野定義了x它就指向x去。所以這種想法是錯的
分清*這個運算符三個作用:
1 乘號, 比如a*b表示a乘以b,是數學運算
2 指針定義標志, 比如我要定義一個指針變數有int* p; 這是定義時標志它是一個指針變數
3 間接訪問, 用於指針間接訪問它所指向的內存單元 如int *p,x; p=&x; 則可*p=5;這樣使用
8. C語言如何創建三級指針
二級指針是int**,相對地慶雹輪,譽信三級肆尺指針是int***
int(*)[2]這屬於數組指針,而不是二級指針。
9. 初學者編程入門:C語言指針使用方法
為初學者服務。這是本文的宗旨。指針是c和c++中的難點和重點。有些程序員們精通dos下的basic。c語言的其它各種特性,在basic中都有類似的東西。只有指針,是sc所不具備的。指針是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越來越熟悉時,你會發現,把與指針攪和在一起的"類型"這個概念分成"指針的類型"和"指針所指向的類型"兩個概念,是精通指針的關鍵點之一。
3、指針的值,或者叫指針所指向的內存區或地址
指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32位程序里,所有類型的指針的值都是一個32位整數,因為32位程序里內存地址全都是32位長。
指針所指向的內存區就是從指針的值所代表的那個內存地址開始,長度為sizeof(指針所指向的類型)的一片內存區。以後,我們說一個指培旅針的值是XX,就相當於說該指針指向了以XX為首地址的一片內存區域;我們說一個指針指向了某塊內存區域,就相當於說該指針的值是這塊內存區域的首地址。
指針所指向的內存區和指針所指向的類型是兩個完全不同的概念。在例一中,碼明指針所指向的類型已經有了,但由於指針還未初始化,所以它所指向的內存區是不存在的,或者說是無意義的。
以後,每遇到一個指針,都應該問問:這個指針的類型是什麼?指針指向的類型是什麼?該指針指向了哪裡?
4、指針本身所佔據的內存區
指針本身佔了多大的內存?你只要用函數sizeof(指針的類型)測一下就知道了。在32位平台里,指針本身占據了4個位元組的長度。指針本身占據的內存這個概念在判斷一個指針表達式是否是左值時很有用。
10. C語言中如何定義一個行指針
int *arry[10]; //指針數組
int (*arryp)[10]; //數組指針,因為數組指針指向數組,而數組也可看做是個指針,那數組指針可以理解為一個二 級指針
int a[10];
arryp = &a; //將數組地址個數組指針
arry[0] = *arryp; //arry[0]是一級指針,要將數組指針賦給指針數組,就要取內容,實際就是 arry[0] = a;