① C語言數組的問題
大部分編譯程序在編譯的時候就把sizeof計算過了,所以main函數中的sizeof(arry)其實就是20,即5個int型數據所佔的空間,而函數中的arry編譯器編譯時認為它是指針型數據,所以就會得到2。
與sizeof不同,strlen這個函數是在運行時計算的,但是只能處理char型數組,所以我把你的代碼修改了一下:
#include <stdio.h>
#include <string.h>
int q_sort(char arry[]);
int main()
{
char arry[]={2,3,4,5,6};
int len=(sizeof(arry)/sizeof(arry[0]));
printf("%d
",len);
q_sort(arry);
return 0;
}
int q_sort(char arry[])
{
int len=(strlen(arry));
printf("%d",len);
}
注意:
strlen返回值就是字元串的長度而不是佔用空間大小。
strlen的參數是char*,即char型變數的指針。
由於strlen是在運行時計算的,所以最後的輸出與main函數相同也是5。
所以問題的關鍵就是:
大部分編譯程序在編譯的時候就把sizeof計算過了,並直接替換成(可以這么理解)類型或是變數的長度。這就是sizeof(x)可以用來定義數組維數的原因 :
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
希望能幫到你
② C語言中怎樣實現對數組數據的刪除、修改
#include<stdio.h>
typedef struct Node{
int a,b;
}node;
node c[100];
int n;
void print(){
int i;
printf("\n當前數據:\n");
for(i=1;i<=n;i++){
printf("第%d組:a=%d,b=%d\n",i,c[i].a,c[i].b);
}
printf("\n\n");
}//輸出
void setnum(){
int i;
printf("輸入n,表示共有n組數據:\n");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("輸入第%d組數據的兩個值a、b,用空格隔開:\n",i);
scanf("%d%d",&c[i].a,&c[i].b);
}
}//設置數據
void remove(){
int i,j;
printf("輸入i,表示要刪除第i數據:\n");
scanf("%d",&i);
for(j=i;j<=n-1;j++){
c[j]=c[j+1];
}//循環覆蓋,讓後一個覆蓋前一個,所以j最大值取n-1
n--;//結構體中的元素減少1個
}//刪除數據
void chang(){
int i,aa,bb;
printf("輸入i,a,b,表示要將第i組數據修改成a、b:\n");
scanf("%d%d%d",&i,&aa,&bb);
c[i].a=aa;
c[i].b=bb;//直接賦值修改
}//修改數據
main(){
int m;
while(1){
printf("輸入:1-輸入數據,2-修改數據,3-刪除數據\n 4-輸出數據,0-退出\n");
scanf("%d",&m);
if(m==0) break;
else if(m==1) setnum();
else if(m==2) chang();
else if(m==3) remove();
else if(m==4) print();
}
}
③ c語言中子函數對數組的操作
數組作為子函數形參的時候,是被當做指針處理的,也就是說
你這樣寫一個子函數
int a(int a[]) ;
等價於
int a(int *a) (其實編譯器是這么處理的)你可以看匯編代碼!
④ c語言數組怎麼清零
c語言不能對這個數組賦值,只能通過遍歷數組達到給數組中每個元素賦值的目的。初始化的時候可以用inta[4]={0};這樣給整個數組元素賦值為0,若想給已初始化的數組清零,也只能遍歷數組。
在C語言中,所謂的「清空」,意思是「無視裡面的數據」,而不是「讓裡面沒有數據」。有時候可能需要把一個數組清零,意思是全部數據都用0填充,可以用庫函數來實現。假設數組名為a,無論什麼類型也無論幾維都一樣,可以寫成memset(a,0,sizeof(a));
(4)c編譯器對數組的處理擴展閱讀:
在C語言中, 數組屬於構造數據類型。一個數組可以分解為多個數組元素,這些數組元素可以是基本數據類型或是構造類型。因此按數組元素的類型不同,數組又可分為數值數組、字元數組、指針數組、結構數組等各種類別。
關於可變長數組(VLA)的問題:原來的C89標准中是不允許可變長數組出現的,但是在C99標准中,加入了對VLA的支持,但是支持的編譯器不多,而且由於棧溢出的安全問題,沒有太多的人敢用這個可變長數組,所以在C11標准中又把它規定為可選實現的功能了。
⑤ c語言中怎樣實現對二維數組元素進行賦值並輸出。
用一個兩重循環就可以了:
#include <stdio.h>
void main()
{int a[3][4] = {0}, row, col;
printf("請輸入數組元素的值(3行4列): ");
for (row=0; row<3; row++)
for (col=0; col<4; col++)
scanf("%d", &a[row][col]);
printf("您輸入的數組為: ");
for (row=0; row<3; row++){//輸出當前行的元素
for (col=0; col<4; col++)
printf("%3d", a[row][col]);//換行
printf(" ");
}
}
(5)c編譯器對數組的處理擴展閱讀:
C語言是一門通用計算機編程語言,廣泛應用於底層開發。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標准局為C語言制定了一套完整的美國國家標准語法,稱為ANSI C,作為C語言最初的標准。 目前2011年12月8日,國際標准化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標准,也是C語言的最新標准,該標准更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。
C語言是一門面向過程的計算機編程語言,與C++,Java等面向對象的編程語言有所不同。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
⑥ C語言 數組初始化為0 編譯器是如何實現的
在編譯時,變數分成兩種形式存放,一種叫初始化段,一種叫未初始化段
如果你定義數組沒有給出賦值語句中的初始值,該數組將保存在未初始化段;否則放入初始化段
編譯器將記錄初始化段中的數組起始地址、數據類型、元素個數,初始化數據在常量區的起始地址,數據個數
在程序運行時,系統先申請各段內存,然後針對初始化段進行初始化工作,方法是從常量段中取出初始化數據給你有初始值的變數賦值,假設你程序開設10個單元的數組,如果沒有優化選項,常量段中將保存10個0用來初始化這個數組,如果有優化選項,可以合並相同常量,則僅保存一個0,並用這個0來初始化所有10個數組元素。
⑦ C++是如何處理數組名的
數組是聚合性數據結構,數組名有兩個意義;
一個是數組的整體存儲空間,一個是數組首位元組的首地址;
這也就是說,對編譯器來說數組名有兩個實現;
一個是一個數據結構(整體存儲空間),另一個是一個「常量指針」;
所以,C++處理指針的方式和C是一樣的;
⑧ C語言如何對數組中的數據進行處理
類似下面簡單處理下
#include"stdlib.h"
#include"stdio.h"
#include"string.h"
charrecord[100][5][16];
intcnt=0;
#defineIS_ALPHA(a)((a>='a'&&a<='z')||(a>='A'&&a<='Z')||(a>='0'&&a<='9')||(a=='_'))
char*get_record(char*str){
inti=0,j=0;
if(cnt>=100)returnNULL;
while(1){
if(IS_ALPHA(*str)){
if(j<15)
record[cnt][i][j++]=*str;
}
else{
if(j){
record[cnt][i][j++]=0;
j=0;
i++;
}
if(*str==0||i==5)break;
}
str++;
}
//addornot
if(i==5){
intn=cnt;
for(i=0;i<cnt;i++){
if(strcmp(record[i][0],record[cnt][0])==0&&
strcmp(record[i][1],record[cnt][1])==0){
if(atoi(record[i][4])<atoi(record[cnt][4])){
strcpy(record[i][4],record[cnt][4]);
}
n--;
break;
}
}
cnt=n+1;
}
return(*str?str:NULL);
}
voidprint_record(){
inti;
for(i=0;i<cnt;i++){
printf("%s%s%s%s%s ",
record[i][0],record[i][1],record[i][2],record[i][3],record[i][4]);
}
}
intmain(){
charstr[]="
DN100CDN_100123
DN100CDN_200216
DN100CDN_100106
DN100CDN_300106
DN100CDN_300107
DN100CDN_200218";
char*s=str;
while(s=get_record(s)){}
print_record();
return0;
}
⑨ 用C語言編譯程序:數組的排序與查找
三個函數的實現如下:
int Lookup(int *a,int b,int &c)
{
int i=0;
c=0;
for(i=0; i<Size; i++)
{
if (a[i] == b)
{
c = i;
return 1;
}
}
return 0;
}
int Lookup(int *a,int Min,int Max ,int &b,int &c)
{
int i;
c = 0;
b = 0;
int count=0;
for (i=0; i<Size; i++)
{
if (a[i] < Min)
continue;
else if (a[i] <= Max)
{
if(0 == b)
{
b = i;
count=1;
}
c = i;
}
else
break;
}
return count;
}
void insert_sort(int *a)
{
int i,j,dataTemp;
cout<<"Input:";
for (i=0; i<Size; i++)
cin>>a[i];
for (i=0; i<Size-1; i++)
{
for (j=i+1; j<Size; j++)
if (a[i] > a[j])
{
dataTemp = a[i];
a[i] = a[j];
a[j] = dataTemp;
}
}
}
⑩ 在C語言,對數組有那些常用處理比如數排序等,請羅列下
數組並非用於處理排序的,需要排序一般使用單、雙向鏈表來實現(當然鏈表也可以看成數組的)。
數組和申請一塊內存存放數據沒有本質區別,只是為了表述和寫源代碼方便。
你完全可以將一個數組看作是一個具有相同數據類型的的內存數據塊。
但是他對寫程序代碼和描述邏輯實現很方便,比如可以利用數組下標變數來實現循環控制,快速存取數據等