关于函数字符数组调用的问题(没有搞清指针的概念)
2011-01-09 21:27
691 查看
调用hoti(char s[])函数,自己试了两种调用方式:
1.编译通过
分析原因如下:
首先对于字符串常量,比如这里的"110",编译器编译后会将它们放入只读节中:
.section .rdata,"dr"
LC1:
.ascii "110\0"
.text
这样在运行该程序时,会将只读节映射到只读的段中。如果运行时更改只读段中的数据,则会出现“一般保护性异常”,通常程序会abort。
再说char *ptest = "110"; 要先搞清楚“=”两边的类型,左边是一个char*类型的指针,右边是一个字符串常量,它所代表的类型是char const*, char const*是不能直接赋值给char*的,如果你用gcc编译器,会出现一个警告:
warning: deprecated conversion from string constant to 'char*'
这就像C++中,const& 不能赋值为非const&一样。不过编译器没有把它当成一个错误,而是一个警告。这时ptest就指向了处于只读节中的数据。
再看看char test[16] = "110";这代表什么呢? test[16]是个char类型的数组,这条代码的作用是将处于只读节中的数据copy到了一份在test[16]数组中了。函数原型是htoi(char s[]),实际上对于编译器而言,它等价于htoi(char* s),如果形参或实参是数组,它都会转化为指针。当你这样调用htoi(test)时,实参test是一个数组类型,这时它会退化成char*传递过去。谢谢网友lili_9809的回答。
参考资料:
1.http://topic.csdn.net/u/20110109/17/37461003-1e7e-4097-8d52-777bc9bfb8eb.html
1.编译通过
= "110"] char *ptest = "110"; ..... int funtion(char *ptest)
分析原因如下:
首先对于字符串常量,比如这里的"110",编译器编译后会将它们放入只读节中:
.section .rdata,"dr"
LC1:
.ascii "110\0"
.text
这样在运行该程序时,会将只读节映射到只读的段中。如果运行时更改只读段中的数据,则会出现“一般保护性异常”,通常程序会abort。
再说char *ptest = "110"; 要先搞清楚“=”两边的类型,左边是一个char*类型的指针,右边是一个字符串常量,它所代表的类型是char const*, char const*是不能直接赋值给char*的,如果你用gcc编译器,会出现一个警告:
warning: deprecated conversion from string constant to 'char*'
这就像C++中,const& 不能赋值为非const&一样。不过编译器没有把它当成一个错误,而是一个警告。这时ptest就指向了处于只读节中的数据。
再看看char test[16] = "110";这代表什么呢? test[16]是个char类型的数组,这条代码的作用是将处于只读节中的数据copy到了一份在test[16]数组中了。函数原型是htoi(char s[]),实际上对于编译器而言,它等价于htoi(char* s),如果形参或实参是数组,它都会转化为指针。当你这样调用htoi(test)时,实参test是一个数组类型,这时它会退化成char*传递过去。谢谢网友lili_9809的回答。
#include <stdio.h>
int main(){ //char test[16] = "110"; char *ptest = "110"; int n = htoi(ptest); /* * 注意 char message1[] = "hello"与 char *message2 = "hello"的区别 * 前者初始化数组,后者是一个指针指向字符串常量,指针变量初始化为指向这个字符串常量的存储位置 * 传字符串地址应该: htoi(ptest) 而 htoi(*ptest)的意思是把字符串地址作为内存地址所存内容传递给函数, * 会发生意想不到的错误,即为段错误. */ printf("%d", n); return 0; } int htoi(char s[]){ int i = 0; if(s[i] == '0'){ i++; if(s[i] == 'x' || s[i] == 'X'); i++; } int hexdigit; int dd = 0; int hexflag = 0; while(s[i] != '\0'){ if(s[i] >= '0' && s[i] <= '9'){ hexdigit = s[i] - '0'; hexflag = 1; } else if(s[i] >= 'A' && s[i] <= 'F'){ hexdigit = s[i] - 'A' + 10; hexflag = 1; } else if(s[i] >= 'a' && s[i] <= 'f'){ hexdigit = s[i] - 'a' + 10; hexflag = 1; } else{ return 1; } dd = dd * 16 + hexdigit; i++; } return dd; }
参考资料:
1.http://topic.csdn.net/u/20110109/17/37461003-1e7e-4097-8d52-777bc9bfb8eb.html
相关文章推荐
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于类成员函数指针的调用问题
- 关于数组做函数形参和指针做函数形参的问题
- 关于指针数组、数组指针、指针函数、函数指针等的问题
- 关于Linux下I2C驱动的Probe方式没有自动生成i2c_client且没有自动调用i2c_driver的.probe指向的函数的问题解决
- 关于字符串 字符数组 字符型指针的问题
- 关于字符指针和字符数组初始化的问题
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 函数内返回字符数组和字符指针的问题
- 关于局部指针变量 函数调用后 该指针的问题
- 关于C语言字符数组、字符串和指针的相关问题
- 关于递归调用,函数指针,数组,字符串的一些理解
- 关于指针和函数和字符数组的一些小结
- 关于在C/C++语言中,函数如何返回数组,数组如何作为参数传递以及返回数组的函数该如何调用问题的总结
- 关于字符指针和字符数组的小问题
- 关于函数和字符指针的一些看法。
- 函数内 声明一个字符数组和一个指向字符串数组的指针 区别
- C语言中,为什么没有把long转化成字符数组的函数?
- 指针数组、数组指针、函数指针、函数指针数组……概念理解
- 关于 malloc和字符指针的一点问题