C语言基础

指针就是内存单元的编号

一个字节八个位  (如:八个零0或八个1)
无论是什么类型的指针变量都是占4个字节;

gcc编译器的执行步骤:
//vi test.c
#include <stdio.h>
int main(void)
{
    printf("Hello World!\n");
    return 0;
}

第一步:预处理把test.c文件中的所有以#开头的行“引用”,或“定义”,最终生成test.i文件:

gcc -E test.c -o test.i

第二步:对test.i文件编译,生成汇编代码test.s

gcc -S test.i -o test.s

第三步:对汇编代码文件test.s,gas汇编器负责将其编译为目标文件
gcc -c test.s -o test.o

第四步:gcc连接器是gas提供的,将程序的目标文件与“静态连接库”和“动态连接库连接起来”,最终生成可执行文件;

gcc test.o -o test




# include <stdio.h> int main(void){ //p是变量的名字,int * 表示p变量只能存放int类型变量的地址 int * p; //那么地址从哪里来 int i=3; // &i 就可以获取到变量i的地址(内存单元的编号) //此时就可以把i变量的地址给到p变量 p= &i;//这里就是指针变量 也可以说地址变量 int a[3]={2,3,4}; // 此时 a 就是a数组中第一个元素的地址 即(&a[0] 等同于 a); } //强烈注意 指针不能 加 乘 除 可以相减(前提是两个指针变量指向同一块连续空间的不同单元也就是数组的情况) 例如: int main(){ int i=5; int j=10; int *p=&i; int *q=&j; int a[5]; //此时不能p-q 因为不是连续空间单元 p=&a[1]; q=&a[4]; //此时可以p-q 因为是连续空间单元 printf("p和q所指向的单元相隔%d个单元",q-p); } 输出 printf("%d\n",*p); int 类型就是 %d longint 类型就是 %ld char 类型就是 %c float 类型就是 %f double 类型就是 %lf 让一个值以8进制输出 %o 让一个值以16进制输出 %#x # include <stdio.h> int f(void){ int j=3; return 10; } void g(void){ // return 1; } int 5main(void){ //斐波那契序列 1 2 3 5 8 13 ...从第3位数开始往后都是前两位数的和 int n, i, f1=1, f2=2, result; scanf("%d",&n); if (1==n) { result=1; } else if (2==n) { result=2; } else { for (i=3; i<=n; ++i) { // 3 4 5 result = f1 + f2; f1=f2; f2=result; } } printf("%d\n",result); // printf("%s\n","hellow world"); return 0; } # include <stdio.h> int f(void){ int j=3; return 10; } void g(int * x,int * y){ //刚刚想不通的问题是 ab的地址不能直接复制给int型变量 必须是int * x int t; t= *x; //这里代表的是 x是地址变量对吧地址变量又有自己的内存空间此刻它的内存空间是a的地址 *x=*y; //*x 是int整型变量 并且是以x(地址变量)的内容(a的内存地址编号)为地址 的变量 *y=t; return ; } int main(void){ int a=3; int b=5; g(&a,&b); printf("a=%d , b=%d\n",a,b); } 数组操作 # include <stdio.h> int main(void){ int x[3][4]={ {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; int a[7]={1,2,3,4,5,6,7}; int i=0,j=6,t; while (i < j) { t=a[i]; a[i]=a[j]; a[j]=t; i++; j--; } for (i=0; i<=6; i++) { printf("%d\n",a[i]); } return 0; } //数组打印操作 # include <stdio.h> void f(int * parr,int len){ for (int i=0; i<len; i++){ printf("%d\n",*(parr + i) ); //数组第一个元素 *parr (即 a[0] 或b[0]) 数组第二个元素*(parr+1) (即 a[1] 或b[1])。。。 } } int main(void){ int a[7]={1,2,3,4,5,6,7}; int b[4]={11,12,13,14}; f(a,7); f(b,4); return 0; } /////数组元素切换与改变 # include <stdio.h> void f(int * parr,int len){ *(parr+1)=88; //一、a[0]是一个变量 而 a等同于 &a[0], //二、 parr是指针变量存放了a的地址; 故 *parr 就是a[0] //三、 *(parr + 3) 也可以简写为parr[3] 又相当于还原成了a[3] 这三种表现形式都是内存中同样一个变量 } int main(void){ int a[7]={1,2,3,4,5,6,7}; int b[4]={11,12,13,14}; f(a,7); printf("%d\n",a[1]); //f(b,4); return 0; } //数组一旦定义,分配的内存无法手动释放,只能是系统释放 char 一个字节 int 4个字节 double 8个字节

你可能感兴趣的:(C语言基础)