`
ileson
  • 浏览: 214876 次
  • 性别: Icon_minigender_1
  • 来自: 河南省
社区版块
存档分类
最新评论

C从头开始

阅读更多
引用
0、关于main函数需要注意两点:
0.1、[K&R]书上的main函数定义写成main(){...}形式,不写返回值类型也不写参数列表,这是Old Style C的风格。Old Style C规定不写返回值类型就表示返回int型,不写参数列表就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,不幸的是现在的C标准为了兼容旧的代码仍然保留了这种语法,但是读者绝不应该继续使用这种语法。
0.2、其实系统在调用main函数时是传参数的,所以main函数最标准的形式应该是int main(int argc, char *argv[])。C标准也规定了int main(void)这种形式,如果不使用系统传进来的两个参数也可以写成这种形式。但除了这两种形式之外,以其它形式定义main函数都是错误的或不可移植的。

C变量
http://lavasoft.blog.51cto.com/62575/186951
1、变量存在哪里?
    ①栈区(Stack):用于存放局部变量(包括方法的参数等)
    ②堆区(Heap):程序员通过C的函数(比如malloc)申请的内存区域,使用完毕后释放(或由OS自动释放)
    ③全局区(静态区(Static)):整个程序运行期间一直存在

demo.c
#include <stdio.h>
void main(){
    
}


2、数组与指针
#include <stdio.h>

int main(void){
    int intArr[]={1,3,45,-4,89};
    int * pt;//定义一个存放指针(地址)的变量
    int i;
    pt=&intArr[0];//把数组首地址赋给指针变量pt;也可以这么写:pt=intArr
    for(i=0;i<5;i++){
        printf("array input:%d",intArr[i]);
        printf("   ;");
        printf("point input:%d",*(pt++));//这样也可以把数组里有值打印出来。
        /*这种写法比用数组下标的方式快,原因是:编译器会将a[i]解析成*(a+i);*/
        printf("\n");
    }
    getch();
    return 0;
}

3、字符串、字符、数组
#include <stdio.h>
int change(char *str){
    str="start study C"; /*在这里也可以看出 双引号引起来的 是个地址*/
    printf("%s \n",str);
    return 0;
}
int main(void){
    char *a="hello";/*声明字符串,"hello" 在内存中的首地址赋给指针变量a*/
    char arr[]={'w','o','r','l','d','\0'};/*定义一个字符串,最后一个'\0'是亮点*/
    printf("%s,%s \n",a,arr);
    printf("%d \n",change(a));
    getch();
}

4、结构体
#include <stdio.h>
#include <string.h>

struct s{
       int a;
       char b[10];/*要给长度*/
       char * str;
};
       
int main(void){
    struct s ss;
    ss.a=100;
	//ss.b="error"; //直接赋值是不行的  
	/*方法一*/
	//struct s ss={12,"hello","world"};
	/*方法二*/
	//strcpy(ss.b,"abc"); //
	/*方法三*/
	//char *p="hello world";
	//memcpy(ss.b,p,strlen(p)+1);
	/*end method*/
    ss.str="hello world!";
    printf("%d\n %s\n %s\n",ss.a,ss.b,ss.str);   
}


二、细枝末节
scanf函数是在对应的地址上写内容.
scanf( "%d,%d" ,a,b);这是在地址值a和b上进行写内容.
要注意区分a的值与a的地址&a之间的区别.
如int a = 1; 假设&a = 0xff2a;
scanf("%d", a); //这是在地址值为1的地址上写内容,并不改变变量a的值.
scanf("%d", &a);//这是在地址值为0xff2a的地址上写内容,这样会改变变量a的值.

#include <stdio.h>
main()
{
   int a=10,*p,**q;//q为放指针的指针的变量。
   p=&a;
   q=&p;
   printf("%d\n",**q);
   getch();
}


1.int i;                                     -----定义整型变量
2.int *p;                                   -----P为指向整型变量的指针变量
3.int a[n];                                 -----定义数组a,它有n个元素
4.int *p[n];                               -----定义指针数组,它由N个指向整型数据的指针元素组成
5.int (*p)[n];                             -----P为指向有N个整型元素组成的一维数组的指针变量
6.int f();                                   -----带回整型函数值的函数
7.int *p();                                 -----带回指针值的函数
8.int (*p)();                               -----指向函数的指针,该函数带回整型数值
9.int **p;                                   -----指向指针的指针




注:c/c++不能返回一个数组,只能返回指向数组的一个指针;

malloc的全称是memory allocation

2、运算符的优先级顺序:
     ++(后自增) > *(解引用) > !=(不等于) > =(赋值)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics