在学习C语言时遇到的一些细节方面的问题

strlen与sizeof的区别: 
strlen用来求字符串的长度用的(不算最后的NULL)而sizeof是用来求指定变量或者变量类型等所占内存大小用的比如strlen("nihao")它的结果是5而sizeof(int)它的结果是4也就是说int型占四个字节。它与是不是字符无关。  
一维数组的字节=sizeof(变量或者变量类型)*数组的长度 
二维数组的字节=sizeof(变量或者变量类型)*数组的行长*数组的列长  
scanf函数用空格、TAB、回车作为输入数据的分隔符,因此该函数无法输入带分隔符的字符串。例如:This is a dog结果是This 。字符串的输出是以\0为结束的。  
一个字符串的输入和输出可以是printf(“%S”,c)scanf(“%s”,c)其中的c是数组。 puts(str)、gets(str)输入输出一个字符串的函数  
合法char str={“good”}   char str=”good” 
不能直接的用赋值语句str=”good”或str={“good”} 只能用strcpy。  
指针就是变量的地址。变量的起始地址就是就是变量的地址,变量的数据就是内容。  
指针与指针变量是不一样的。指针是一个地址,而指针变量是用来存放地址的内存单元。例如:&Data和ptrData是不一样的,前者是固定的地址,而后者的地址是可以改变的。指针变量不仅仅可以是一个变量的地址,还可以是数组和函数的起始地址。  
int *ptrData  int Data  
ptrData=&Data;  就是Data=*ptrData 
第二个*和第一个*是不样的,第一个是定义指针变量,第二个是指向变量Data,就是把ptrData指中的内容显示出来。  
 int a[10]  int *ptr=a; 指针ptr+n表示指向数组中a[0]后的n个数,注意必须是连续的数据,是数组才行。       
还有*++ptr  *ptr++  (*ptr)++   *(++ptr)等是不一样的,优先级相同,都是从右往左算的。  
字符串处理函数:strlen, strcat, strcpy,strcmp使用方法是:strcat(a,b),strlen(a),等,其中a,b是字符串常量、字符型数组名、字符型指针。  
二维数组a[3][3]的a表示的意思是第0行的全部元素。即a[0]。   
char **ptr  char (*ptr)[10]  char *ptr[10]   ptr=&arry 


二级指针、指针数组和数组指针的区别: 
char **ptr  char (*ptr)[10]  char *ptr[10]  三者的区别: 第一个是二级指针式地址的地址。第二个是定义了一个指针变量ptr将他指向了一个二维数组的行,也可以说是一个一维数组,比如a[0]可以说是一维数组,也可以说是二维数组的第0行。第三个是定义了一个数组,是用来存放地址的,他指向的可以是不连续的数据区域。比如char *ptr[10]={“asd”,”ghjk”,”polk”}其中ptr[0]指向的内容是”asd”,即ptr[0]是二维数组的行,ptr[0][0]=’a’, ptr[0][0]=’a’,ptr[0][0]=’a’,     等等。他们都是类似二维数组。  
函数的写:有返回值的函数前面加上返回值的类型如:int d(int k),无返回值的函数前面直接用void。无形参就写成int d(void)或int d()。 
int s(int a,int b),其中的s就是函数,a,b是形参,一定要有数据的类型,int s同样是函数输出的数值的类型。函数的调用直接用s(a,b)即可。  
函数的传递:值传递和地址传递 
值传递:单向传递,只能由实参向形参传递,不能由形参向实参传递。例如: void  swap(int a,int b) {   int tmp;    tmp=a;    a=b;    b=tmp; } 
void main (void) {  int a=15;int b=5;   swap(a,b); 
printf(“%d,%d”,a,b); } 
结果是什么:15,5。还是没变。原因是子函数的值(5,15)不能传给主函数中的调用的实参,结果显示的还是实参。如果上面的子函数是有返回值的,可以用return函数,那么还是可以传递上面的结果。所以值传递通常要用到return函数。  
地址传递:它是地址的传递是双向的。 
void  swap(int *a,int *b) {   int tmp;    tmp=*a;    *a=*b;    *b=tmp; } 
void main (void) {  int a=15;int b=5;   swap(&a,&b); printf(“%d,%d”,a,b); } 


结果是:5,15。改变。原因是通过地址双向传递的。上面的地址并未发生改变,子函数的作用是通过取指针指向的内存单元的内容交换,后内存单元的地址不变。由于地址是双向传递,所以可以是子函数的结果传递给主函数中对子函数的调用。也可用到return函数。  
int ert(char str[])中的char str[]是合法的。或者int ert( char  *str)亦是合法的虽然没定义数组长度和指针初始值。  
指针函数就是返回值是一个地址,它是一个函数。例如:char *asd(int n) 返回值是一个地址,但是为什么其类型是一个字符型的呢?因为返回的指针所指向的内容是一个字符型的。它和指针数组不一样,不能进行++,- -运算。  
函数指针是一个指针变量,用来指向一个函数的,即函数的首地址就是函数名。 例如:char (*asd)(int a) 其输出值是一个字符型的值。asd只是指向函数入口的指针。

猜你喜欢

转载自blog.csdn.net/chenwenjie666/article/details/78721566