我已经学习Java几个月了,现在我开始学习C.
我有点困惑,我的印象是通过引用传递一个对象并传递指向该对象的指针是同样的事情:我认为不同的是,在Java中所有对象的传递都是自动完成的指针,如C必须在这里和那里洒上小小的星号和&符号.最近,在谈话中,我确信存在差异!
传递引用和传递指针有什么区别?
我无法理解如何为双指针分配内存.我想读取一个字符串数组并存储它.
char **ptr;
fp = fopen("file.txt","r");
ptr = (char**)malloc(sizeof(char*)*50);
for(int i=0; i<20; i++)
{
ptr[i] = (char*)malloc(sizeof(char)*50);
fgets(ptr[i],50,fp);
}
Run Code Online (Sandbox Code Playgroud)
而不是这个我只是分配一个大的内存块并存储字符串
char **ptr;
ptr = (char**)malloc(sizeof(char)*50*50);
Run Code Online (Sandbox Code Playgroud)
那会错吗?如果是这样,为什么呢?
昨天在我的采访中我被问到这个问题.(当时我被这么多突然的问题压得很厉害).
int *p;
*p=23;
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)
这段代码有问题吗?
我向他解释说你正在尝试为没有分配内存的指针赋值.
但他的反应方式,就像我错了.虽然我得到了这份工作,但在那之后他说Mohit再次考虑这个问题.我不知道他想说什么.请让我知道我的答案有什么问题吗?
编辑 我在表格上添加了代码; -
int *p;
p=malloc(sizeof(int));
*p=23;
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)
这一定是完美的代码...我是对的..
EDIT2
int *p;
*p=23;
OR
int *p=23;
Run Code Online (Sandbox Code Playgroud)
我认为两者都有问题.因为有些正在讲述帖子的标题.
这是来自OOP高级课程考试的问题,用C++教授(在TAU大学,本学期):
问:C++指针和引用有什么区别?
A. A reference is the entire object while a pointer is only the address of it. B. The same meaning, and difference is only in syntax and usage. C. The syntax used to access the object. D. Pointers are simple address to the object while a reference uses the virtual table.
哪个是正确的答案?
课程老师声称A是正确的,并且对象的引用实际上是对象本身.那是对的吗?我意识到访问引用等同于访问对象本身,但是,在破坏引用时,我们不会破坏对象本身.引用是对象的替代名称,但是说reference == object true?
顺便说一句,讲师给了一个faq的以下链接作为对他的主张的支持,引用:
"重要提示:尽管引用通常是使用底层汇编语言中的地址实现的,但请不要将引用视为指向对象的滑稽指针.引用是对象.它不是指向对象的指针,也不是对象的副本.这是对象."
但是,我认为这是不正确的.
问题很简单.据我了解,GCC坚持认为字符将是字节对齐的,并且在32位环境中对齐4字节对齐.我也知道C99标准6.3.2.3,它表示在未对齐的指针类型之间进行转换会导致未定义的操作.C的其他标准对此有何评论?这里也有许多经验丰富的编码员 - 对此有任何看法将不胜感激.
int *iptr1, *iptr2;
char *cptr1, *cptr2;
iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
Run Code Online (Sandbox Code Playgroud) 我正在研究一个交换指针的函数,我无法弄清楚为什么这不起作用.当我在交换函数中打印r和s时,值被交换,这使我相信我正在操纵一个我不理解的副本,因为我通过引用p和q.
void swap(int *r, int *s)
{
int *pSwap = r;
r = s;
s = pSwap;
return;
}
int main()
{
int p = 7;
int q = 9;
swap(&p, &q);
cout << "p = " << p << "q= " << q << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印:p = 7q = 9
我有一个函数有两个类的实例作为参数:
void cookPasta(const Tomato& tomato, const Meat* meat)
{
if (meat != nullptr)
cookPastaWithMeat(tomato, *meat);
else
cookPastaWithoutMeat(tomato);
}
Run Code Online (Sandbox Code Playgroud)
正如函数所示,Tomato总是需要一个实例,而是Meat可选的,nullptr而是可以传递一个实例.我这样做是为了允许cookPasta函数被调用,即使用户从未声明过Meat该类的实例.
在函数签名中混合引用和指针是不好的做法吗?
我试图理解字符串,数组和指针之间的关系.
我正在阅读的这本书有一个程序,它在其中初始化变量如下:
char* szString= "Name";
Run Code Online (Sandbox Code Playgroud)
我理解这一点的方式是,C风格的字符串只是一个字符数组.数组只是引用指针(存储数组的第一个值)和偏移量的简写版本.即
array[5]实际上返回从表达式计算的内容*(array+5).
因此,根据我的理解和测试,szString实际上被初始化为指向存储"Name"的数组的第一个地址的指针.我可以推断出这个因为输出到:
cout << *szstring;
Run Code Online (Sandbox Code Playgroud)
是字符"N".
我对声明的理解
cout << szstring;
Run Code Online (Sandbox Code Playgroud)
输出字符"Name",方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符.另一方面,对于参数*szstring,使用支持C样式字符串的此方法的不同版本.
因此,如果我可以初始化一个char类型指针来寻址一个chars数组中的第一个元素(一个C风格的字符串),为什么我不能初始化一个整数数组中第一个元素的int类型指针,如下所示:
int* intArray = {1,2,3};
Run Code Online (Sandbox Code Playgroud) 这合法吗?ptr它可以在被释放后分配给它吗?
int * ptr = (int*) malloc(sizeof(int));
free(ptr);
ptr = (int *) malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud) 我是golang的新手,并且很难理解为什么我的代码中有一个错误而不是另一个状态.我已经有一段时间了,因为我已经覆盖了指针,所以我可能生锈了!
基本上我有一个存储库结构,我用来将一个对象存储在内存中,它有一个Store函数.
type chartsRepository struct {
mtx sync.RWMutex
charts map[ChartName]*Chart
}
func (r *chartsRepository) Store(c *Chart) error {
r.mtx.Lock()
defer r.mtx.Unlock()
r.charts[c.Name] = c
return nil
}
Run Code Online (Sandbox Code Playgroud)
所以它只是将RW互斥锁置于其上并将指针添加到地图,由标识符引用.
然后我有一个函数,它将基本上遍历这些对象的一部分,将它们全部存储在存储库中.
type service struct {
charts Repository
}
func (svc *service) StoreCharts(arr []Chart) error {
hasError := false
for _, chart := range arr {
err := svc.repo.Store(&chart)
// ... error handling
}
if hasError {
// ... Deals with the error object
return me
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用,看起来一切正常,但是在尝试以后访问数据时 …