欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

c语言:sizeof的使用,其不是函数,是一个操作符关键

时间:2022-09-15 08:06:43 其他范文 收藏本文 下载本文

这次小编在这里给大家整理了c语言:sizeof的使用,其不是函数,是一个操作符关键,本文共6篇,供大家阅读参考。

c语言:sizeof的使用,其不是函数,是一个操作符关键

篇1:c语言:sizeof的使用,其不是函数,是一个操作符关键

关于sizeof的使用,注意其不是函数,是一个操作符关键字

程序一:

#include void fun(int arr[10]){printf(“fun::%dn”, sizeof(arr));//}int main{int i = 10;short a = 0;int arr[10];fun(arr);printf(“%dn”, sizeof(arr));//40 printf(“%dn”, sizeof(a++));//2printf(“%dn”, a);//0printf(“%dn”, i);//10system(“pause”);return 0;}

结果:

fun::4

40

2

0

10

请按任意键继续. . .

程序二:

定义一个数组arr,输出arr和&arr的区别#include int main(){int n = 10;int arr[10] = {0};int *p = NULL;int (*q)[10] = NULL;printf(“%dn”, sizeof(n));//4printf(“%dn”, sizeof(int));//4printf(“%dn”, sizeof(arr));//40 printf(“%dn”, sizeof(&arr));//4printf(“%pn”, arr);//00D4FACC &arr[0],它表示数组首元素的地址printf(“%pn”, &arr);//00D4FACC,它表示数组的地址,这两个表示意义不同p = arr;q = &arr;printf(“p+1=%pn”,p+1);//p+1=007DF958printf(“q+1=%pn”,q+1);//q+1=007DF97Creturn 0;}

结果:

4

4

40

4

00F5F7C8

00F5F7C8

p+1=00F5F7CC

q+1=00F5F7F0

请按任意键继续. . .

篇2:C语言system使用教程:system函数用法解析

system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码:

#include

#include

#include

#include

int system(const char * cmdstring)

{

pid_t pid;

int status;

if(cmdstring == NULL){

return (1);

}

if((pid = fork())<0){

status = -1;

}

else if(pid = 0){

execl(“/bin/sh”, “sh”, “-c”, cmdstring, (char *)0);

-exit(127); //子进程正常执行则不会执行此语句

}

else{

while(waitpid(pid, &status, 0) < 0){

if(errno != EINTER){

status = -1;

break;

}

}

}

return status;

}

分析一下原理估计就能看懂了:

当system接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl(“/bin/sh”, “sh”, “-c”, cmdstring, (char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数,在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了。

再解释下fork的原理:当一个进程A调用fork时,系统内核创建一个新的进程B,并将A的内存映像复制到B的进程空间中,因为A和B是一样的,那么他们怎么知道自己是父进程还是子进程呢,看fork的返回值就知道,上面也说了fork在子进程中返回0,在父进程中返回子进程的pid。

windows中的情况也类似,就是execl换了个又臭又长的名字,参数名也换的看了让人发晕的,我在MSDN中找到了原型,给大家看看:

HINSTANCE ShellExecute(

HWND hwnd,

LPCTSTR lpVerb,

LPCTSTR lpFile,

LPCTSTR lpParameters,

LPCTSTR lpDirectory,

INT nShowCmd

);

用法见下:

ShellExecute(NULL, “open”, “c:\a.reg”, NULL, NULL, SW_SHOWNORMAL);

你也许会奇怪 ShellExecute中有个用来传递父进程环境变量的参数 lpDirectory,linux中的execl却没有,这是因为execl是编译器的函数(在一定程度上隐藏具体系统实现),在linux中它会接着产生一个linux系统的调用 execve, 原型见下:

int execve(const char * file,const char **argv,const char **envp);

看到这里就会明白为什么system()会接受父进程的环境变量,但是用system改变环境变量后,system一返回主函数还是没变,

原因从system的实现可以看到,它是通过产生新进程实现的,从我的分析中可以看到父进程和子进程间没有进程通信,子进程自然改变不了父进程的环境变量。

使用了system函数就能执行dos指令。

#include

#include

xiaoyu()

{

char *a;

int n=0;

FILE *f;

f=fopen(“file.bat”,“w+”);/*新建一个批处理*/

if(f==NULL)

exit(1);

a=“echo”; /*DOS命令*/

for(n=65;n<=90;n++)/*大写A-Z*/

fprintf(f,“%s %cn”,a,n);/*利用ASCII码输出A-Z,写出批处理*/

fclose(f);

system(“file.bat”);/*运行批处理*/

}

main()

{

char *string;

xiaoyu();

string=“echo C语言的system函数n”;/*输出中文*/

system(string);

system(“pause”);/*程序暂停*/

}

C中可以使用DOS命令,以后编程通过调用DOS命令很多操作就简单多了。

篇3:c语言:实现一个函数,判断一个数是不是素数。

实现一个函数,判断一个数是不是素数,

程序:

#include #include int prime(int num) //prime表示素数{int i = 0;int k = 0;k = sqrt(num);for (i = 2; i <= k; i++){if (num%i == 0){ return 0;}}return 1;}int main{int num;int ret;printf(“请输入一个大于1的正整数:”);scanf(“%d”, &num);ret = prime(num);if (ret == 1){printf(“%d是素数n”, num);}else{printf(“%d不是素数n”, num);}return 0;}

结果一:

请输入一个大于1的正整数:8

8不是素数

请按任意键继续. . .

结果二:

请输入一个大于1的正整数:17

17是素数

请按任意键继续. . .

篇4:c语言:实现一个函数判断year是不是润年。

实现一个函数判断year是不是润年,

程序:

#includeint leap_year(int year)//leap year 闰年{if ((year % 4 == 0 && year / 100 != 0) || (year % 400 == 0)){return 1;}else{return 0;}}int main(){int year;int ret = 0;printf(“请输入年份:”);scanf(“%d”, &year);ret=leap_year(year);if (ret==1){printf(“%d年是闰年n”, year);}else{printf(“%d年非闰年n”, year);}return 0;}

结果一:

请输入年份:

是闰年

请按任意键继续. . .

结果二:

请输入年份:1995

1995年非闰年

请按任意键继续. . .

篇5:c语言:实现一个函数,打印乘法口诀表,口诀表的行数

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定,

输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表,

程序:

#includevoid mul(int n)//multiplication 乘法{int i, j;for (i = 1; i <= n; i++){for (j = 1; j <= i; j++){printf(“%d*%d=%-2d ”, i, j, i*j);//其中%2d中的2表示输出两格,数向后靠齐,即右对齐;%-2d,则表示数左对齐}printf(“n”);}}int main{int n=0;printf(“请输入乘法口诀表的行:”);scanf(“%d”,&n);mul(n);return 0;}

结果:

请输入乘法口诀表的行:12

1*1=1

2*1=2 2*2=4

3*1=3 3*2=6 3*3=9

4*1=4 4*2=8 4*3=12 4*4=16

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

10*1=10 10*2=20 10*3=30 10*4=40 10*5=50 10*6=60 10*7=70 10*8=80 10*9=90 10*10=100

11*1=11 11*2=22 11*3=33 11*4=44 11*5=55 11*6=66 11*7=77 11*8=88 11*9=99 11*10=110 11*11=121

12*1=12 12*2=24 12*3=36 12*4=48 12*5=60 12*6=72 12*7=84 12*8=96 12*9=108 12*10=120 12*11=132 12*12=144

请按任意键继续. . .

篇6:C语言:使用malloc开辟一个3*4的二维数组,并将内容

方法一:

#include#includeint main(){ int(*p)[4] = (int (*)[4])malloc(12 * sizeof(int));//数组指针 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) {*(*(p + i) +j) = i * 4 + j + 1 ; } } for ( i = 0; i < 3; i++) { for (j = 0; j < 4; j++) {printf(“%dt”, *(*(p + i) + j)); } } printf(“n”); system(“pause”); return 0;}

方法二:

#include#includeint main(){ int i = 0; int j = 0; int **p = (int **)malloc(3 * sizeof(int)); for (i = 0; i < 3; i++) { *(p + i) = (int *)malloc(4 * sizeof(int)); } for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) {p[i][j] = 4 * i + j + 1; } } for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) {printf(“%d ”, *(*(p + i) + j)); } } system(“pause”); return 0;}

帝王故事刘备是个好哥们但不是一个好皇帝

《c语言:sizeof的使用,其不是函数,是一个操作符关键(精选6篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

最新推荐
猜你喜欢
点击下载本文文档