當前位置:首頁 » 編程語言 » c語言指針存取數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言指針存取數

發布時間: 2022-04-17 14:43:50

A. c語言中,指針,存儲,2進制的問題。

1 例如 int * p[10];//聲明一個指針數組
*p[3]表示間接訪問數組里的第三個指針指向的變數。
(*p)[3] 表示的是訪問這個數組的第一個指針指向的位置再偏移三個單位的變數。
數組名就是一個常量指針,*(p+1)p[1] 基本上沒區別。
2 char 1 個位元組 shor int 2 long int 8 int 4 float 4 double 8 這個也跟電腦位數有關,像INT在16位上是2 32位上是4 64位上應該是8 到是64上的還是4 這個編譯器有關吧,限制住了
3 如果是無符號 就是UNSINGED 就是不表示負號 但是一般 二進制的開頭會有一位用來表示負號,剩下表示數值,這就是原碼,還有補碼,反碼,這個你願意知道的話,可以網路一下。
八進制 十六進制都會按二進制算 因為電腦就認識 1 和0

B. 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越來越熟悉時,你會發現,把與指針攪和在一起的"類型"這個概念分成"指針的類型"和"指針所指向的類型"兩個概念,是精通指針的關鍵點之一。
本篇文章來源於 黑基網-中國最大的網路安全站點 原文鏈接:http://www.hackbase.com/lib/2008-03-09/13993.html

C. c語言,數據儲存,指針問題

地址那一串數字也是放在一個專門的空間中存儲的,稱作指針的指針,例如
int a=5;
int *pa=&a; //pa指針中存儲了變數a的地址
int **ppa=&pa //ppa指針,其中存儲了指針pa的地址,也就是你說的那一串數字

至於變數a的名稱會在編譯的時候生成一個符號列表,程序中所有的符號都會記錄在這個表中,這些是C語言編譯器必須完成的功能,作為普通程序員,只需知道這些基本原理,並知道如何使用這些內容即可,畢竟我們不是去做出一個C語言的編譯器。

D. c語言指針詳解

指針是一個特殊的變數,它裡面存儲的數值被解釋成為內存里的一個地址。數據在內存中的地址也稱為指針,如果一個變數存儲了一份數據的指針,我們就稱它為指針變數。

計算機中所有的數據都必須放在內存中,不同類型的數據佔用的位元組數不一樣,例如 int 佔用 4 個位元組,char 佔用 1 個位元組。

為了正確地訪問這些數據,必須為每個位元組都編上號碼,就像門牌號、身份證號一樣,每個位元組的編號是唯一的,根據編號可以准確地找到某個位元組。

C語言用變數來存儲數據,用函數來定義一段可以重復使用的代碼,它們最終都要放到內存中才能供 CPU 使用。數據和代碼都以二進制的形式存儲在內存中,計算機無法從格式上區分某塊內存到底存儲的是數據還是代碼。

當程序被載入到內存後,操作系統會給不同的內存塊指定不同的許可權,擁有讀取和執行許可權的內存塊就是代碼,而擁有讀取和寫入許可權(也可能只有讀取許可權)的內存塊就是數據。

CPU 只能通過地址來取得內存中的代碼和數據,程序在執行過程中會告知 CPU 要執行的代碼以及要讀寫的數據的地址。

如果程序不小心出錯,或者開發者有意為之,在 CPU 要寫入數據時給它一個代碼區域的地址,就會發生內存訪問錯誤。這種內存訪問錯誤會被硬體和操作系統攔截,強製程序崩潰,程序員沒有挽救的機會。

變數名和函數名為我們提供了方便,讓我們在編寫代碼的過程中可以使用易於閱讀和理解的英文字元串,不用直接面對二進制地址,那場景簡直讓人崩潰。

需要注意的是,雖然變數名、函數名、字元串名和數組名在本質上是一樣的,它們都是地址的助記符,但在編寫代碼的過程中,我們認為變數名表示的是數據本身,而函數名、字元串名和數組名表示的是代碼塊或數據塊的首地址。

(4)c語言指針存取數擴展閱讀

指針使用(* 和 &

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

E. 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;

}

F. c語言文件讀寫,如何正確的存取多位數(int)

C語言將整形數據存儲到文件中,可採用兩種方法,1、二進制存取 2、字元方式存取。

因存儲方式的不同,讀取也要採用相應的方式進行操作,否則不能正確得到存儲的數據。

  1. 二進制存取

    二進制方式是將原數據的內存格式存儲到文件中,在同類型的機器上可以正確的讀取。但如果換成不同類型的機器則會出現數據解釋錯誤,因此,具有不可移植性。

    這種方式,採用的存取函數相應為:fwrite()和fread().

    如:

    int num=12345;

    FILE *fp=fopen( "datafile", "wb" );

    fwrite( &num, sizeof(int), 1, fp ); //將num數據寫入文件

    ....

    FILE *fp=fopen( "datafile", "rb" );

    fread( &num, sizeof(int), 1, fp ); //讀文件數據到num中

  2. 字元方式存取

    字元方式是將數據的可見內容,以字元形式存儲到文件中,可以在任何機器上閱讀並讀取,方便不同系統間的數據傳遞。

    這種方式,採用的存取函數相應為:fprintf()和fscanf().

    如:

    int num=0;

    FILE *fp=fopen( "datafile", "w" );

    fprintf(fp, "%d ", num ); //將num數據寫入文件

    ....

    FILE *fp=fopen( "datafile", "r" );

    fscanf(fp,"%d", &num ); //讀文件數據到num中

G. c語言 指針 字元存取問題

需糾正兩個問題:
(1) *p2 結尾處少了一個字元串結束符號。要加上。
(2) 輸出前,要把指針撥回到起始點, p2=&b[0]; 或 p2=b;。
for( ; *p1!='\0'; p1++,p2++) { *p2=*p1; }; 這句以後要添加:
*p2='\0'; p2=b;
然後再: for(;*p2!='\0';p2++)printf("%c",*p2); 輸出,就正確了。

H. c語言中,字元串指針怎樣實現對字元串的讀取與存儲

比如char s[30];
數組名s可以看作數組的首地址,可以直接對它進行操作;
或用一個char指針:char *p(注意:"字元串指針"沒有這個說法,可以叫做指向字元數組的指針)
p = s;或p = &s[0];用指針p指向s數組的首地址。
不知讀取是指列印還是引用;假如要訪用一個元素,可以用*(p + i),i指偏移量相當於p[i];也可以把p當成數組名用,比如p[2]指的是數組s的第三個元素,假如把『a』賦給第n個元素:*(p+n-1) = 'a';或p[n-1] = 'a';
如果直接用指針存個字元串:前提是字元串大小不能超過30 - 1;scanf("%s",p);復制可以使用
strcpy(p,"..........")等;
如果不通過指向字元數組:那麼必須要內存分配,用到malloc函數;
例如p = (char *)malloc(sizeof(char) *30);給指針p分配一個大小30位元組的內存用來存儲字元串;
接下來和上面差不多,不過p[30]必須是有結束符'\0';

I. c語言指針用法

1、使用場景

使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:

#include<stdio.h>

#include <stdlib.h>

int main(int argc, char const *argv[])

{

int a[5]={0,1,2,3,4};

int *b,*d;

int c=2;

int *e=a; //e指向a數組首地址

//*b=2; 無法直接初始化

//printf("%d ", *b);

e=e+2; //移動兩個地址單元

d=&c; //d指向c的地址來表示值

c=4; //修改原c變數的值,d指針的值會發生改變

b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值

*b=2;//分配空間後可以直接賦值了

printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);

2、類型說明

(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元

(2)char *b:表示一個指向char變數的指針

*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:

int nums[5]={0,1,2,3,4};

int *a=nums;

printf("%d %d %p ",*a,*(a+1),a);

(9)c語言指針存取數擴展閱讀:

指針的運算

指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算

(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。

int nums[5]={0,1,2,3,4};

int *a=nums;

(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。

int nums[5]={0,1,2,3,4};

int *a=nums;

a=a+2;

printf("%d ",*a);

結果輸出2。

參考資料來源 :指針-網路

J. c語言指針存取問題

*是解引用運算符 &是取地址運算符

*p=&a這樣寫是p是指向指針的指),這時候*p前面要有類型符(比如int等),通常的情況是這樣用的int *p=&a;這一句作用相當於int *p; p=&a; 兩句,這句話的意思是定義一個int類型指針,然後用a的地址給p賦值;